PHP5 CLASSE GÉNÉRIQUE GESTION ROUTINES MYSQL

cs_oxxo Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 janvier 2007 - 18 janv. 2007 à 07:25
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016 - 20 janv. 2007 à 18:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41159-php5-classe-generique-gestion-routines-mysql

guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
20 janv. 2007 à 18:33
salut,
Autre chose, tes controles dans free_result ne te servent pas puisque tu utilises le masque d'erreur @ pour mysql_free_result.

En plus si tu enlèves le @, tes contrôles ne seront pas performants car une
requête du type insert into tablename champs1,champs2 values ('select','val2') provoquera une erreur, essaies donc de trouver plutôt un pattern decrivant les mots clès select,show,explain à parser avec une fonction preg si tu veux aller dans ce sens.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
20 janv. 2007 à 09:59
moi mon singleton gère les multiple connection... .. . ;o)

je stock tout dans un tableau dont les index sont

$myObjectArray['dbType:serverName:dbName'] = $myObject;

si tu change de type de sgdb, de serveur ou de base le singleton instancie un nouvel objet tout en gardant les avantages du singleton... .. . ;o)

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 janv. 2007 à 08:49
Je ne vais pas vraiment dans ton sens lol...je dis juste que le singleton convient dans la plupart des cas, mais pas dans tous. Par contre, on ne DOIT PAS balancer la requête dans le constructeur de la classe, comme l'a dit Kankrelune.
La classe que j'utilise à mon taf se gère comme une autre classe : pas de singleton, on peut l'instancier autant de fois que l'on veut.
Mais l'instanciation ne fait que te connecter à ta bdd avec tes paramètres. Pour me connecter à une autre bdd, j'instancie un nouvel objet.
On peut aussi imaginer un seul objet en singleton, mais plusieurs ressources de connexion possible gérées au sein de ton objet.
Ou encore, le principe d'un multiton.
Y a des tas de manières de faire. A toi de trouver celle qui te convient le mieux.
cs_oxxo Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 janvier 2007
19 janv. 2007 à 20:30
Merci d'aller dans mon sens MALALAM, en réécrivant la classe, j'ai effectivement eu des soucis pour me connecter à des bases différentes avec le singleton, mais j'ai réglé le problème.

Je poste une nouvelle source très prochainement.

Je tiens à vous remercier car je pense avoir bien progressé. La classe est déjà fonctionnelle, la je taff sur la génération des logs pour le bench et pour les erreurs.

Pourrais-tu me mettre sur la voie pour permettre ou non l'utilisation du singleton ?

Merci
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 janv. 2007 à 08:04
Oxxo => Il y a déjà beaucoup de classes d'abstraction de base de données, sur le site. Regardes en quelques unes, ça te donnera sans doute des idées.

Le singleton, oui...et non. Perso, j'ai souvent besoin d'accéder à 2 bdd différentes dans un même script (parce que j'ai un utilisateur par bdd et limité à SA bdd...et pas un utilisateur global ayant accès à tt le serveur de bdd, question de sécurité), et le singleton est problématique pour ça. Il faut en permettre ou non l'utilisation, en fait.
cs_oxxo Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 janvier 2007
18 janv. 2007 à 18:26
Ok, merci beaucoup.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 janv. 2007 à 18:24
"Comment devrais-je les appeler ? "maMethode()", tout simplement ?"

> $this->maMethode();

"Quelle est la différence entre if($a 'ok') et if($a 'ok') ? Merci de m'éclairer sur ce point"

la comparaison strict compare la valeur et le type... la comparaison non strict compare la valeur convertie numériquement... exemple... .. .

$test1 = false;

if($test1 == 0)
// ça passe pourtant test 1 ne vaut pas (int)0 mais (bool)false

if($test1 === 0)
// ça ne passe pas car test1 ne vaut pas (int)0

en outre tu gagne (très légèrement) en perf car php ne perd pas de temps à convertir la valeur de la variable en valeur numérique... .. .

@ tchaOo°
cs_oxxo Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 janvier 2007
18 janv. 2007 à 17:51
Je vous aime ! Je sens que je vais progresser avec vous.
Alors je reprends dans l'ordre :

"Pourquoi appelles-tu tes méthodes privées non statiques via self::maMethode () ?"

=> Comment devrais-je les appeler ? "maMethode()", tout simplement ?

"Tu devrais laisser le choix d'utiliser ou non ton bench dans la méthode query"

=> Tout à fait d'accord. Et je prends note pour les logs.

"Je ne vois pas l'intérêt de forcer par défaut les paramètres de connexion."

=> Et bien parce que je trouve cela plus simple, dans la majorité des cas, je n'utilise qu'une seule bdd sur un seul et même serveur. Le fait de le définir dans la classe me permet le cas échéant de ne modifier que la valeur par défaut de ces attributs sans avoir a rechercher dans la masse des autres fichiers les endroit ou j'initialise une connexion. Question de facilité donc et de maintenance du code. Tout en gardant la possibilité de se connecter à un autre serveur ?

"Quant tu codes en POO, autant coder de manière stricte. et non"

> Quelle est la différence entre if($a = 'ok') et if($a === 'ok') ? Merci de m'éclairer sur ce point.

"tu devrais utiliser les exceptions pour gérer tes erreurs."

=> Tout à fait d'accord, je prends note.

Voila pour l'essentiel, je prend donc bien note de vos remarques. Concernant le singleton, je procédais comme cela avant, je vois qu'apparemment c'est préférable de continuer sur cette voie.

Pour la prochaine version, corrigez moi si j'en oubli :

Une classe abstraite nommée "sgbd", ce qui permettra de dériver d'autres classes en fonction du type d'sgbd.

Une classe fille de sgbd nommée "mysql" sur le principe du singleton. Donc un seul objet mysql dans le script à qui j'envois toutes les requêtes. Economie de mémoire, effectivement, et de ligne de code.
Possibilité de bench, au choix de l'utilisateur avec logs.(un booléen à l'instanciation, génération des logs en xml?)
Et du coup, avec toutes ces modifs (réécriture complète devrais-je dire?), je pense que la classe apportera des fonctionnalités intéressantes par rapport aux fonctions mysql_* de php, ou mysqli, pour répondre à ta question MALALAM. (qui plus est mysqli est loin d'être installer chez la majorité des hébergeurs?).

Je me mets au boulot et je vous montre tous ça, merci pour tous ces conseils.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 janv. 2007 à 16:38
Bah oui c'est pas très propre et v'la ce qu'elle se prend la mémoire... muarf... qui plus est... j'avais pas vu mais... les methodes de traitement des données (mysql_fetch_* & co) ne sont pas implémentées donc il faut jongler entre la classe et les fonctions natives... bref bof bof... .. . :o(

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 janv. 2007 à 14:04
J'avais même pas noté qu'il forçait une instance pour chaque requête; c'est effectivement une très mauvaise idée.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 janv. 2007 à 13:08
Comme malalam je ne vois pas l'interet de faire une classe sgdb si ce n'est pas une class d'abstraction... .. .

Sinon pourquoi forcer à instancier un objet à chaque fois qu'on veut faire une requete... c'est couteux en perf et il n'y a aucun gain... au contraire tu devrais plus t'orienter vers du singleton... .. .

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 janv. 2007 à 08:23
Hello,

faudrait que je regarde en détail, mais j'ai des questions et des remarques, en vrac, sans aller chercher trop loin :
Pourquoi appelles-tu tes méthodes privées non statiques via self::maMethode () ?
Tu devrais laisser le choix d'utiliser ou non ton bench dans la méthode query. Ca, moi, je l'utilise en dév, mais pas en prod, c'est du temps et des ressources perdues pour rien.
Un tableau de log d'erreurs aurait été mieux venu, en statique pourquoi pas, référencé par la ressource de connexion et la requête. Ca faciliterait le suivi et la sauvegarde des logs, le cas échéant.
Je ne vois pas l'intérêt de forcer par défaut les paramètres de connexion. On aurait même pu imaginer une seule instance de ton objet gérant plusieurs connexions. Pourquoi pas.
Quant tu codes en POO, autant coder de manière stricte :
if(stristr($this->query, 'select') == true)
ça, ce n'est pas strict du tout, c'est même du laisser aller :
if(stristr($this->query, 'select') === true)
C'est un détail dans ce cas-ci, mais ça peut ne pas l'être dans d'autres cas.
Ensuite, je n'aurais pas codé ça comme ça mais bon, là...c'est de la préférence.
Plus largement, tu devrais utiliser les exceptions pour gérer tes erreurs.

Bref, je dois aller bosser, donc ma dernière remarque est moins gentille : qu'apporte ta classe ? Pourquoi l'utiliser plutôt que les fonctions mysql_* de php, ou mysqli ?
Il n'y a pas d'abstraction, tu ne facilites pas l'utilisation, tu obliges à mixer les méthodes de ta classe avec les fonctions mysql de base, tu n'apportes pas de nouvelles fonctionnalités.

Bref, ton code est clair, agréable à lire, mais y a du boulot, selon moi. Tant pour le code en lui-même que pour son utilité.
cs_oxxo Messages postés 5 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 janvier 2007
18 janv. 2007 à 07:25
Voila, j'attends vos commentaires. D'autres sources viendront très prochainement pour compléter celle ci.

(classes facilitant la construction de requêtes, classe de gestion utilisateurs pour module d'administration, classe pour la gestion des mails ...)

Vive PHP5 et vive la POO, sans qui de pauvres développeurs comme nous n'aurions pas de vie sexuel.
Rejoignez-nous