Design Patterns : Active Record

Un développeur m'a dit : "je ne comprend pas pourquoi on nous apprend pas ça à l'école ... ". Le ça en question c'est le design pattern Active Record et comme tout design pattern c'est avant tout une méthodologie.

Prenons un cas très simple : une base d'article ( titre + texte ) pour laquelle on dois faire une interface de saisie ( ajouter, modifier, supprimer ). Bon, l'exemple est vraiment basique et beaucoup d'entre vous me dirons : "mais pourquoi présenter quelque chose que n'importe quel framework fait déjà ? " ... je répondrais, parce que beaucoup ne savent pas ce qu'il y a dedans !

Basiquement, pour la partie php, on aurais tendance à faire ça : ( je vous fait grâce de la partie html, un formulaire, 3 champs ... ça devrais aller non ? )

switch($action){
case "ajouter":
 mysql_query("INSERT INTO articles(titre,texte) VALUES('".addslashes($_REQUEST["titre"])."','".addslashes($_REQUEST["texte"])."'");
break;
case "modifier":
 mysql_query("UDPATE  articles SET titre='".addslashes($_REQUEST["titre"])."',texte='".addslashes($_REQUEST["texte"])."' WHERE id_art='".$_REQUEST["id_art"]."'");
break;
case "supprimer":
 mysql_query("DELETE FROM articles WHERE id_art='".$_REQUEST["id_art"]."'");
break;

 

Mais bon, dès qu'il faut rajouter un champ ... bof, bof ... sans parler que il y a de nombreux type de champs ( select, radio, file ...) qui demanderais un peu plus qu'un simple addslashes.

Donc, maintenant, partons du principe que nos noms de champs on le même nom que dans la base ( et ce n'est vraiment pas choquant si on imagine que ces champs sont générés )

switch($action){
 case "ajouter":
 $champ = "";
 $value = "";
 $nom_chp = mysql_query("SHOW FIELDS FROM `articles`");
 while($nm_chp = mysql_fetch_array($nom_chp)) {
 $champ .= $nm_chp["Field"].",";
 $value .= "'".addslashes($_REQUEST[$nm_chp["Field"]])."',";
 }
 mysql_query("INSERT INTO articles(".substr($champ,0,-1).") VALUES(".substr($value,0,-1).")");
break;}

Donc là, quelle que sois les champs dans la base, il seront sauvés. Voila les bases d'un active record. Sauf qu'un design pattern doit pouvoir être utilisé n'importe où, Il nous faut donc deux variables en plus : le nom de la table, et le champ de référence( dans l'action du form par ex ) .

Finalement , on pourrais avoir quelque chose comme ça :

switch($action){
case "ajouter":
 $champ = "";
 $value = "";
 $nom_chp = mysql_query("SHOW FIELDS FROM `$nom_table`");
 while($nm_chp = mysql_fetch_array($nom_chp)) {
  $champ .= $nm_chp["Field"].",";
  $value .= "'".addslashes($_REQUEST[$nm_chp["Field"]])."',";
 }
 mysql_query("INSERT INTO $nom_table(".substr($champ,0,-1).") VALUES(".substr($value,0,-1).")");
break;
case "modifier":
 $tmp = "";
 $nom_chp = mysql_query("SHOW FIELDS FROM `$nom_table`");
 while ($nm_chp = mysql_fetch_array($nom_chp)) {
  $tmp .= $nm_chp["Field"]."='".addslashes($_REQUEST[$nm_chp["Field"]])."',";
 }
 mysql_query("UPDATE $nom_table SET ".substr($tmp,0,-1)." WHERE $chp_ref='".$_REQUEST[$chp_ref]."'");
break;
case "supprimer":
 mysql_query("DELETE FROM $nom_table WHERE $chp_ref='".$_REQUEST[$chp_ref]."'");
break;

Il est facile de rajouter un type de champ à ce code pour effectuer des actions avant l'insertion dans la base. ( par exemple : transférer le fichier provenant d'un 'file' ).

Evidemment, le design pattern complet est plutôt à faire en objet, cela simplifie sa spécialisation mais pour la compréhension un controller marche aussi.

Compliquer les choses est à la porté de n'importe quel développeur, faire simple est une autre histoire

 

 

 



Login