Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2601 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Petite class PHP d'automatisation des requetes SQL standard

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petite class PHP d'automatisation des requetes SQL standard

n°1295239
the_bigboo
Posté le 30-01-2006 à 23:34:27  profilanswer
 

Salut a tous !
 
Comme j'en avait marre d'avoir un code plein de mysql_connect() , de mysql_query() et de mysql_close() j'ai créé ces class PHP qui automatisent toutes les requetes SQL standard de type INSERT, SELECT, UPDATE et DELETE, ne vous attendez pas a du left JOIN ou des trucs tres complexes, elles gerent les conditions les recherches multicriteres, bien pratiques pour faire du ménage dans le code :)
 
J'ai mis un certain temps a la coder, la prochaine etape est un mode de déboguage avancé... Si elle peut vous servir , je la laisse a disposition ;)
lib_SQL.php ( 14Ko )

mood
Publicité
Posté le 30-01-2006 à 23:34:27  profilanswer
 

n°1295264
Djebel1
Nul professionnel
Posté le 31-01-2006 à 01:18:17  profilanswer
 

l'archive est buggée chez moi

n°1295280
the_bigboo
Posté le 31-01-2006 à 07:28:04  profilanswer
 

utilise winrar ;)

n°1296242
chaced
Posté le 01-02-2006 à 11:50:57  profilanswer
 

the_bigboo a écrit :

utilise winrar ;)


 
Ou unrar :D


---------------
CPU-Z | Timespy | Mes bd
n°1296291
the_bigboo
Posté le 01-02-2006 à 12:43:55  profilanswer
 

bref... J'espere qu'elle pourra vous servir, moi je ne me sert plus que d'elle !

n°1296791
chaced
Posté le 01-02-2006 à 18:42:20  profilanswer
 

Juste un truc, ton mysql_close ne sera jamais appelé.

Code :
  1. function GetLastID($Table,$SQLFunction,$IDField)
  2.          {
  3.          $SQL = $SQLFunction();
  4.          $Request = mysql_query("SELECT ".$IDField." FROM ".$Table." ORDER BY ".$IDField." DESC LIMIT 1" );
  5.          $row = mysql_fetch_array($Request);
  6.          return $row[$IDField];
  7.          mysql_close($SQL);
  8.          }


---------------
CPU-Z | Timespy | Mes bd
n°1296909
the_bigboo
Posté le 01-02-2006 à 20:23:03  profilanswer
 

exaact, si vous avez des suggestions ou des remarques je suis preneur, je mettrai les update dessus

n°1297330
the_bigboo
Posté le 02-02-2006 à 13:28:35  profilanswer
 

avez vous des suggestions , des choses que je puisse ajouter ?

n°1297563
fluminis
Posté le 02-02-2006 à 16:29:06  profilanswer
 

Moi perso, je n'aime pas trop utiliser la fonction die.
C'est bien pratique mais si par malheur il y a une erreur, la page est arretée net de charger.
 
Je prefere souvent utiliser le @ et faire mes propres traitement d'erreur.
 

Code :
  1. function db_query($sql){
  2. global $LINK,$CONF;
  3. if(db_connect()){
  4.  $result = @mysql_query($sql,$LINK);
  5.  if(!$result && $CONF['show_errors']){
  6.   print_error("Mysql Query Failed: $sql\nMysql said : ". mysql_error($LINK));
  7.  }
  8.  return $result;
  9. }else{
  10.  return 0;
  11. }
  12. }



---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1297573
the_bigboo
Posté le 02-02-2006 à 16:36:36  profilanswer
 

oui, c'est prévu, je vais implémenter une gestion avancée des erreurs ;)
 
Mon prochain projet est un editeur PHP interfacé Web ;)

mood
Publicité
Posté le 02-02-2006 à 16:36:36  profilanswer
 

n°1297694
Djebel1
Nul professionnel
Posté le 02-02-2006 à 18:30:36  profilanswer
 

en fait je me questionnais sur l'intéret d'avoir une 'petite usine à gaz' comme ça, qui gère toutes les requêtes simplement en lui passant un tableau.
 
Parce qu'on est tous d'accord qu'il faut séparer le SQL de la logique métier, afin notamment de changer de base de données facilement. Mais là quand on va changer de base de donnés, je suis pas certain qu'il ne faudra modifier que ta lib_sql. Les tableaux que l'on passe en parametre à ces fonctions seront surement à revoir aussi. Donc tout sera à revoir quoiqu'il arrive si on change de base de données
 
Moi personnellement j'ai un singleton qui gère la connection à la base, fait les requetes (rien de bien sorcier, un cas selet et un cas modif base), gere les transactions (s'il y en a).
Et donc les requetes SQL elles-même sont dans une couche au-dessus, mais qui reste séparer de la logique métier. Donc si je change de base, j'ai mon singleton et la couche avec les requetes à changer.
Et je suis pas sur que ça fasse beaucoup plus de boulot.
 
Qu'en pensez vous ?

n°1297714
fluminis
Posté le 02-02-2006 à 18:51:50  profilanswer
 

Djebel1> tout à fait d'accord avec toi, il faut séparer la couche metier du SQL.  
 
D'ailleur, il existe des outils très puissant qui permettent de faire cette séparation de manière quasi automatique : les ORM (object relationnal mapping)
Il y en a un qui me vient à l'esprit pour le php : Propel http://propel.phpdb.org/trac/ mais il en existe d'autres


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1297719
Djebel1
Nul professionnel
Posté le 02-02-2006 à 18:58:06  profilanswer
 

fluminis> oui, on est d'accord, mais comment le mettre en oeuvre si on développe ses propres classes pour accéder à la base ?
Avec une classe gérant toutes les requetes possibles, et à laquelle on a plus qu'à balancer des paramètres (un peu comme ici), ou avec une couche supplémentaire dans laquelle on met les requetes SQL ?


Message édité par Djebel1 le 02-02-2006 à 18:58:33
n°1297740
masklinn
í dag viðrar vel til loftárása
Posté le 02-02-2006 à 19:14:36  profilanswer
 

the_bigboo a écrit :

Salut a tous !
 
Comme j'en avait marre d'avoir un code plein de mysql_connect() , de mysql_query() et de mysql_close() j'ai créé ces class PHP qui automatisent toutes les requetes SQL standard de type INSERT, SELECT, UPDATE et DELETE, ne vous attendez pas a du left JOIN ou des trucs tres complexes, elles gerent les conditions les recherches multicriteres, bien pratiques pour faire du ménage dans le code :)
 
J'ai mis un certain temps a la coder, la prochaine etape est un mode de déboguage avancé... Si elle peut vous servir , je la laisse a disposition ;)
lib_SQL.php ( 14Ko )


Au lieu de réinventer la roue, je pense que tu devrais rechercher "object relational mapping" sur la Wikipedia US, et lire le premier résultat se présentant.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1297744
fluminis
Posté le 02-02-2006 à 19:16:44  profilanswer
 

Perso, je viens de développer un outils d'ORM en C#, je ne tiens pas à dire que mon architecture est la meilleure loin de là, mais voila comment j'ai fait. L'architecture est la suivante :
 
j'ai une couche metier (classes Article, Magasin)
ces classes derivent de ma classe DataObject.
 
Chaque modification d'un champ de Article averti DataObject que le champs est changé (facilité en C# avec les setters/getters)
Ensuite lorsque je fais monArticle.Save();
DataObject entre en jeux et construit les requetes, non pas en SQL mais en utilisant un objet SqlEngine. C'est cet objet qui sera dérivé en MySqlEngine ou PostgresSqlEngine...
 
SqlEngine contient des fonctions comme : addField pour ajouter un champ dans la requete, addCondition pour ajouter une condition...
 
Une autre solution est comme tu l'évoques, celle d'écrire en dur les requetes SQL dans les objet. Mais si tu changes de base de données, il va te falloir réécrire tout ou partie de tes requetes SQL et donc aller toucher a tous tes objets.
 
A voir laquelle des deux solutions te convient le mieux.


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1297759
cinocks
Posté le 02-02-2006 à 19:28:27  profilanswer
 

the_bigboo a écrit :

Salut a tous !
 
Comme j'en avait marre d'avoir un code plein de mysql_connect() , de mysql_query() et de mysql_close() j'ai créé ces class PHP qui automatisent toutes les requetes SQL standard de type INSERT, SELECT, UPDATE et DELETE, ne vous attendez pas a du left JOIN ou des trucs tres complexes, elles gerent les conditions les recherches multicriteres, bien pratiques pour faire du ménage dans le code :)
 
J'ai mis un certain temps a la coder, la prochaine etape est un mode de déboguage avancé... Si elle peut vous servir , je la laisse a disposition ;)
lib_SQL.php ( 14Ko )


 
De ce que j'ai vu, j'ai l'impression que tu suis la regle du : pourquoi faire simple quand on peut faire compliquer?
Faire une classe gerer la connexion les recordset est une bien meilleure idée que de faire qq chose de relativement figé. Tout depend de la complexité de tes requetes. Mais ce devient tres vite dur d'utiliser tes classes. ;)


Message édité par cinocks le 02-02-2006 à 19:31:41

---------------
MZP est de retour
n°1297773
Djebel1
Nul professionnel
Posté le 02-02-2006 à 19:40:11  profilanswer
 

fluminis a écrit :

Perso, je viens de développer un outils d'ORM en C#, je ne tiens pas à dire que mon architecture est la meilleure loin de là, mais voila comment j'ai fait. L'architecture est la suivante :
 
j'ai une couche metier (classes Article, Magasin)
ces classes derivent de ma classe DataObject.
 
Chaque modification d'un champ de Article averti DataObject que le champs est changé (facilité en C# avec les setters/getters)
Ensuite lorsque je fais monArticle.Save();
DataObject entre en jeux et construit les requetes, non pas en SQL mais en utilisant un objet SqlEngine. C'est cet objet qui sera dérivé en MySqlEngine ou PostgresSqlEngine...
 
SqlEngine contient des fonctions comme : addField pour ajouter un champ dans la requete, addCondition pour ajouter une condition...
 
Une autre solution est comme tu l'évoques, celle d'écrire en dur les requetes SQL dans les objet. Mais si tu changes de base de données, il va te falloir réécrire tout ou partie de tes requetes SQL et donc aller toucher a tous tes objets.
 
A voir laquelle des deux solutions te convient le mieux.


ha oui ton système a l'air très sympa. Mais j'ai un peu de mal avec les DataObject.  
Sont-ils vraiment si portables ? Si tu veux changer de base pour une qui n'est pas supportée par le DataObject, tu ne dois vraiment retoucher QUE cet objet ? Puisque comme tu dis toi-même, ta couche métier dérive de ta couche DataObject.
 
Disons que moi j'ai une couche accès à mysql, et une couche requête mysql en dur. Si je change de base de données, je sais que je n'aurai que ces deux couches à réécrire. Qu'en est-il avec le DataObject, tu ne devras retoucher que lui ?

n°1297779
the_bigboo
Posté le 02-02-2006 à 19:42:28  profilanswer
 

d'ou dans le titre automatisations des requetes SQL standard !
 
je cherche pas a faire un truc complexe, je l'ai developpée en fonction de mes besoins, quand j'aurais besoin de plus je ferais plus c'est tout !
Quant a pourquoi faire simple quand on peut faire compliqué, c'est juste que je préfere avoir quelques declarations plutot que toutes les requetes ( mysql_connect(), mysql_select_db(), mysql_query(), mysql_fetcharray/object() , mysql_close() )

n°1297782
fluminis
Posté le 02-02-2006 à 19:46:37  profilanswer
 

pour simplifier, dans ma class DataObject, il n'y a pas une ligne de sql :
 
Y a des trucs du genre :
   SqlEngine engine = Database->GetSqlEngine('UPDATE');
 
   engine.AddField('nom_article', 'valeur');
   ...
   engine.AddCondition('id_article', 'mon id');
   engine.Execute();
 
bien sur, il y a de la généricité, pour que DataObject connaisse la liste de tout les champs de l'objet.


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1297785
Djebel1
Nul professionnel
Posté le 02-02-2006 à 19:49:27  profilanswer
 

mouais bon vais devoir reprendre ma couche SQL moi quoi   [:bap2703]

n°1297787
Djebel1
Nul professionnel
Posté le 02-02-2006 à 19:52:11  profilanswer
 

vous auriez quelques liens sympatoches et pas compliqués pour commencer avec les DAO, expliquer leur fonctionnement et comment les construire ?


Message édité par Djebel1 le 02-02-2006 à 19:52:37
n°1298035
fluminis
Posté le 02-02-2006 à 20:00:03  profilanswer
 

Les liens que j'ai sont pour le language C#, j'en ai pas sous la main pour le PHP dsl, mais la théorie est somme toute la même
 
Une très bonne page (en anglais) :
http://www.codeproject.com/dotnet/CodeGenResource.asp
 
Et celle là sur la théorie des ORM :
Mapping Objects to Relational Databases: O/R Mapping In Detail :
http://www.agiledata.org/essays/mappingObjects.html
 
Edit: en php, comme indiqué plus haut : Propel http://propel.phpdb.org/trac/
regarde le, tu n'as pas forcement besoin de réinventer la roue.


Message édité par fluminis le 02-02-2006 à 20:01:59

---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1298082
Djebel1
Nul professionnel
Posté le 02-02-2006 à 20:24:51  profilanswer
 

super merci je vais m'y coller :)

n°1298125
the_bigboo
Posté le 02-02-2006 à 21:09:51  profilanswer
 

je vais regarder aussi :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Petite class PHP d'automatisation des requetes SQL standard

 

Sujets relatifs
[PHP] vBulletin mettre un bloc "login" en dehors du forumPulbot ou la complexité des requêtes... Ô secours...
Erreur SQL 1064 : Requête imbriquée avec jointure !!!DSP à virgule fixe en Q15 ! Petite question !
Autorité de Certification en PHPAide suppression de fichier en PHP >>PLZ<<
Requêtes avec mysql sur 2 tablesProblème ActionScript/PHP/XML : enregistrement d'un .xml
[resolu] transmission de variables à un CSS via PHP[PHP/MYSQL] changer juste une valeure d'un bd
Plus de sujets relatifs à : Petite class PHP d'automatisation des requetes SQL standard


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR