Une classe PHP pour faciliter les accès à la base de données

Tags: PHP, classes, MySql,

Voici une classe que je trimbale depuis plusieurs années. J'ai décidé de prendre la peine d'écrire un article sur son utilisation parce que je l'utilise dans une série de vidéos qui seront bientôt disponibles sur Developpeur-africain.org.

Cette classe est destinée à ceux qui n'emploient pas une librairie objet-relationnelle telle que doctrine (www.doctrine-project.org) ou PHP-ORM (http://code.google.com/p/php-orm/). Bien que j'encourage fortement l'utilisation de telles libraires, je pense que pour les petits sites de quelques pages, il est parfois plus simple d'avoir recours aux bonnes vieilles méthodes de la vieille école. Mais sans trop de détours rentrons donc dans le vif du sujet.

Les tâches d'insertion, de sélection, de mise à jour et de suppression sont non seulement répétitive, mais elles consomment également un temps considérable lors du développement d'applications Web. Nous passons donc beaucoup de temps à écrire des requêtes SQL de manipulation de donneées alias DML (Data Manipulation Language).

Ci-dessous nous définissons une classe nommée "database" qui contient quatres fonctions: insert, select, update, delete.

Insertion de données

  1.  
  2. <?php
  3.  
  4. class database
  5. {
  6. function select ($requete) {
  7. $resultat = @mysql_query($requete) ;
  8. if (!is_resource($resultat)) {
  9. $erreur = mysql_error() ;
  10. throw new Exception($erreur) ;
  11. }
  12.  
  13. $donnees = array() ;
  14. while($ligne = mysql_fetch_assoc($resultat)) {
  15. # nettoyage
  16. foreach ($ligne as $clef => $valeur) {
  17. if (!is_numeric($valeur)) {
  18. $ligne[$clef] = stripslashes($valeur) ;
  19. }
  20. }
  21. $donnees[] = $ligne ;
  22. }
  23.  
  24. return $donnees ;
  25. }
  26.  
  27. function update ($table, $colonnes, $conditions) {
  28. $colonnes_ = array() ;
  29. foreach($colonnes as $colonne => $valeur) {
  30. if (!is_numeric($valeur)) {
  31. $valeur = "'" . mysql_real_escape_string($valeur) . "'" ;
  32. }
  33. $colonnes_[] = "$colonne = $valeur" ;
  34. }
  35.  
  36. $conditions_ = array() ;
  37. foreach($conditions as $condition => $valeur) {
  38. if (!is_numeric($valeur)) {
  39. $valeur = "'" . mysql_real_escape_string($valeur) . "'" ;
  40. }
  41. $conditions_[] = "$condition = $valeur" ;
  42. }
  43.  
  44. $sql = "UPDATE $table SET " ;
  45. $sql .= join(', ', $colonnes_) ;
  46. $sql .= ' WHERE ' . join(' AND ', $conditions_) ;
  47.  
  48. $resultat = @mysql_query($sql) ;
  49. if (!$resultat) {
  50. $erreur = mysql_error() . "n[$sql]" ;
  51. throw new Exception($erreur) ;
  52. }
  53.  
  54. return true ;
  55. }
  56.  
  57. function delete ($table, $conditions) {
  58. $conditions_ = array() ;
  59. foreach($conditions as $condition => $valeur) {
  60. if (!is_numeric($valeur)) {
  61. $valeur = "'" . mysql_real_escape_string($valeur) . "'" ;
  62. }
  63. $conditions_[] = "$condition = $valeur" ;
  64. }
  65.  
  66. $sql = "DELETE FROM $table WHERE " . join(' AND ', $conditions_) ;
  67. $resultat = @mysql_query($sql) ;
  68. if (!$resultat) {
  69. $erreur = mysql_error() . "n[$sql]" ;
  70. throw new Exception($erreur) ;
  71. }
  72.  
  73. return true ;
  74. }
  75.  
  76. function insert ($table, $valeurs) {
  77. $colonnes_ = array_keys($valeurs) ;
  78. $valeurs_ = array_values($valeurs) ;
  79. foreach($valeurs_ as $clef => $valeur) {
  80. if (!is_numeric($valeur)) {
  81. $valeur = "'" . mysql_real_escape_string($valeur) . "'" ;
  82. }
  83. $valeurs_[$clef] = $valeur ;
  84. }
  85.  
  86. $sql = "INSERT INTO $table (" ;
  87. $sql .= join(', ', $colonnes_) ;
  88. $sql .= ') VALUES (' ;
  89. $sql .= join(', ', $valeurs_) ;
  90. $sql .= ')' ;
  91.  
  92. $resultat = mysql_query($sql) ;
  93. if (!$resultat) {
  94. $erreur = mysql_error() . "n[$sql]" ;
  95. throw new Exception($erreur) ;
  96. }
  97.  
  98. return true ;
  99. }
  100. }
  101.  
  102. ?>
  103.  


Note: Toutes les valeurs non numériques sont envoyées à la fonction mysql_real_escape_string() dans le but de protéger les caractères spéciaux d'une commande SQL... C'est donc une défense contre les attaques par injection SQL.

En bonus, voici une exemple d'utilisation de la classe...

Exemple d'utilisation



  1.  
  2. try {
  3.  
  4. $db = new database ;
  5.  
  6. // Insertion du texte Hello World et de la date courante dans les colonnes
  7. // message et date de la table nommée testing
  8. $donnees = array (
  9. 'texte' => 'Hello World",
  10. 'date' => date("d M Y", time()) ;
  11. ) ;
  12. $db->insert('testing', $donnees) ;
  13.  
  14. // Modification du message de la ligne ayant 5 comme id
  15. $donnees = array (
  16. 'texte' => 'Hello World from Devafrique"
  17. ) ;
  18. $db->update('testing', $donnees, array('id' => 5)) ;
  19.  
  20. // Suppression de la ligne ayant 8 comme id
  21. $db->delete('testing', array('id' => 8)) ;
  22.  
  23. // Selectionner toutes les lignes
  24. $lignes = $db->select('SELECT * FROM testing') ;
  25. foreach($lignes as $ligne) {
  26. print "Texte: {$ligne['texte']} ;
  27. print "Date {$ligne['date']}" ;
  28. print "<br/>" ;
  29. }
  30. }
  31. catch(Exception $e) {
  32. die('Erreur: ' . $e->getMessage()) ;
  33. }
  34.  


J'espère que cette classe vous sera bien utile :)