CLASS LANGAGE SQL

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 23 juil. 2004 à 23:03
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014 - 14 déc. 2014 à 23:53
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/24813-class-langage-sql

pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
14 déc. 2014 à 23:53
bonjour,
bon boulot :) j'ai fait un peu la meme chose (comme quoi j'aurais du chercher avant de me lancer) mais j'ai utilisé une interface et 2 classes qui l'implémentent. des fonctionnalités objet du php5.
http://codes-sources.commentcamarche.net/source/100816-classe-pour-poser-et-valider-un-formulaire
je vais m'inspirer aussi de ton boulot pour m'améliorier ;) et aussi j'envisage d'ajouter la prise en compte de pdo.
cs_Merzhin56 Messages postés 4 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 13 août 2008
17 août 2008 à 16:34
Je n'ai pas encore testé, mais source propre, claire, simple, et fonctionnelement c'est exactement ce que j'aurai codé si je n'avais pas trouvé cette source.

Il me reste à la tester, mais merci beaucoup pour ce code.
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
11 oct. 2007 à 01:11
et je mettrais bien
mysql_free_result($result);
dans la fonction sql_dataseek
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
11 oct. 2007 à 01:02
bonsoir,

$line = $db->sql_numrows($result);
$data = $db->sql_fetchrow($result);

for($i=0;$i<$line;$i++)
echo $data[$i]['field1']."\n";

----> deux connections a la base, alors qu'on peut eviter la première en mettant $data[$i] a la place de $i<$line et enlever la ligne $line = $db->sql_numrows($result); ;)

--->
for($i=0;isset($data[$i]);$i++)
echo $data[$i]['nom']."\n";

sinon, très belle source !
dpozega Messages postés 1 Date d'inscription mardi 4 novembre 2003 Statut Membre Dernière intervention 12 septembre 2007
12 sept. 2007 à 08:49
Bonjour, très sympa cette class mais il manque une fonction mysqli_free_result non ?
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
17 juil. 2005 à 23:03
Bah je ne l'ai pas gèré auto là... si tu veux tu peux l'ajouter... moi je le gère ailleurs avec cette fonction http://www.phpcs.com/code.aspx?ID=29889
magicyoda Messages postés 44 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 17 juillet 2005
17 juil. 2005 à 22:25
Hello, merci pour ce code je vais voir ce que je peux en tirer ! ;)
Ca serait pas interessant de faire un addslashes() automatique lors d'une insertion ?
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
8 janv. 2005 à 17:14
Tu n'as pas tout lu l'explication que j'ai donné ...
Regarde en haut : "Explication des constantes"
Et dans les commentaires on en a parlé aussi...
http://www.php.net/define (ca, c'est pas un site de débutant)

Ensuite, bah le script c'est bien écrit à quoi il sert et comment l'utiliser... ya tous les exemples nécessaires :) Relis bien le texte que j'ai écrit plus haut et si tu ne comprends toujours pas, tu poseras une question plus spécifique :)

Bonne Chance.
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
8 janv. 2005 à 12:51
Salut !

Je suis débutant en php, j'ai dl le .zip que tu as mis GRenard et pardonne moi d'avance mais je ne comprends pas comment ca marche et à quoi ca sert...J'ai une erreur lorsque j'essaye d'afficher index.php (You are not allowed to access to this page.)
Pourtant j'ai essayé de comprendre en lisant les commentaires mais je ne comprends pas.

J'espère que qq voudra bien me l'expliquer ... :-(
Merci pour tout
*Prière de ne pas m'envoyer sur des sites de débutants car il y a rien de pire comme réponse
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
9 déc. 2004 à 23:36
J'ai mis ceci :

Ici, j'ai mis l'utilisation des librairies suivantes :
- mySQL (3.x, 4.1)
- mySQLi (4.1.2+)

Tu peux rajouter d'autres librairies pour les faire fonctionner sur d'autres sortes de base de données.
Donc, c'était déjà précisé.
cs_jeff Messages postés 18 Date d'inscription mercredi 10 octobre 2001 Statut Membre Dernière intervention 1 avril 2005
9 déc. 2004 à 12:29
petite précision importante, Ce code permet de se connecter à une base de données MySQL et non à une base de données SQL !
mais je la trouve très sympas !
Gorrk Messages postés 96 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 26 avril 2007
8 déc. 2004 à 14:22
Pas mal comme classe, quelques regrets cependant, elle n'est pas ecrite en php5 et je suis partisant d'une ecriture plus claire (je ne dis pas que la mienne est la plus claire :-p).

Concernant ma classe MySQL, bientôt je mettrai en ligne une classe MySQLi avec les mêmes methodes.
gastonzine Messages postés 4 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 12 octobre 2004
12 oct. 2004 à 20:38
Un gros merci pour tes précisions!
Très sympa =)
Je vais me creuser un peu. Mais tu m'as bien aidé.
Merci l'ami!
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
12 oct. 2004 à 19:21
Pardon, plus précisément c'est Field le retour du SQL ! essais le dans phpmyadmin et tu vas voir ce que ca retourne !
(ne pas utiliser mysql_list_fields car ca n'existe pas en mysqli...)
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
12 oct. 2004 à 19:18
premièrement dans ton select si tu as mis les champs c'est que tu les connais ;)
Mais si par exemple tu ne les connais pas (tu fais un select * ... meuh c'est pas bien ca)
Tu peux créer une fonction simple à part qui permet d'intéragir avec la classe. Tu peux modifier la classe... (mmm c moins bon ca mais si c'est une bonne fonctionnalité c'est une bonne idée)
et tu utilises le SELECT suivant :
SHOW COLUMNS FROM tables
tu vas ensuite retrouver dans l'argument [$i]['fields'] la valeur des champs que tu recherches !
Donc c'est un peu comme faire 2 select si tu veux vraiment faire comme ca !

Bonne chance !
gastonzine Messages postés 4 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 12 octobre 2004
12 oct. 2004 à 18:14
Salut GRenard,
bravo pour ton codage. C'est du haut de gamme.
J'ai cependant une question.
As-tu une technique pour utiliser ta classe pour afficher le résultat de n'importe quelle requete?
Je voudrais faire un gestionnaire de requete à partir de ta classe. Mais le problème (ou je n'ai pas tout compris), c'est qu'il faut connaitre à l'avance le nom des champs....

for($i=0;$i<$line;$i++)
echo $data[$i]['field1']."\n";

Quand on code avec ta classe, il faut savoir à l'avance ce que l'on veut afficher.... y'a-t-il un moyen de faire une boucle qui afficherait tous les champs de toutes les lignes?

exemple: SELECT nom, age, ville FROM table...

Et la boucle serait capable de compter qu'il y a 3 champs par ligne et afficherait alors:

sebastien 26 Metz
Gerard 32 Lyon
....
....


Si t'as 5 minutes ou si tu sais comment faire... Ou une piste...

Merci!!!
@+
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
28 sept. 2004 à 16:12
Voila, j'ai rajouté une explication des constantes... tu les définies dans le fichier avant d'appeler le file database !
jpabeille13 Messages postés 11 Date d'inscription vendredi 9 juillet 2004 Statut Membre Dernière intervention 27 septembre 2004
27 sept. 2004 à 21:31
??? IN_LS et NO_DB c'est quoi??? c'est où qu'on les definit?
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
26 sept. 2004 à 19:05
Modification de la source ! Meilleur gestion si vous faites un fetchrow et un fetchrowset ensuite (ou inversement) !
fluminis Messages postés 73 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 20 juin 2005
13 sept. 2004 à 09:21
D'accord, merci... alors Classes me voici :o)
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
13 sept. 2004 à 05:07
PHP se "compile" sur le coté serveur chaque fois que quelqu'un appelle une page. Ce n'est pas des dizaines ni même des centaines de lignes qui causeront une différence à vos scripts.
Certains programme inclus un fichier de fonctions contenant que des fonctions et qui peut faire 2000 lignes pour un fichier. En tant que tel, une fonction tout seul ne fait rien. Ceci influence peut-etre un peu le temps d'execution, mais ce n'est pas énorme.
fluminis Messages postés 73 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 20 juin 2005
12 sept. 2004 à 12:20
Merci pour cette source tres interessante.

je me pose quand meme une petite question.
Je comprends qu'utiliser une classe apporte bien des avantages mais que ce passe-t-il si ma classe Mysql (ou tout autre classe) contient des dizaines et des dizaines de lignes de code avec des dizaines de fonctions et qu'au final, j'utilise dans mon fichier php une ou deux de ces fonctions.
Que fait php de tout ce code non execute et non utilise?
Est ce que c'est couteux en temps d'execution?
aquewel Messages postés 143 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 6 juin 2010
24 août 2004 à 02:56
placer un champs ". $data[$i]['region']." qui me retourne 21 resultats sur trois colonnes car j'arrive pas a le faire avec la methode traditionnel !
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
23 août 2004 à 22:03
C'est plutot bizarre comme question ... mais bon, tu dois faire un SELECT champ1, champ2, champ2 FROM table...
ainsi tu auras 3 colonnes...
tk, si c'est pas ca que tu veux, repose mieux ta question !
aquewel Messages postés 143 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 6 juin 2010
23 août 2004 à 21:40
comment on fait pour mettre un des données en trois colonnes avec ton script ????????????????????
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
10 août 2004 à 18:42
Je m'excuse, la fonction transform_specialchars() permet d'executer htmlspecialchars() sur toutes les entrées d'un tableau (qui peut sortir de la base de données :))
Si vous ne voulez pas utiliser la fonction, vous n'avez qu'à passer FALSE comme 2e argument de la fonction sql_fetchrow ou sql_fetchrowset.
Ici la fonction est à la suite de la classe. Il est conseilllé d'appeler un fichier "function.php" avant d'appeler la classe. (Comme dans le Zip)


Petit rappel : Il est préférable d'enregistrer vos informations correctement pas déjà formaté pour un affichage. (dans la base de données, si vous faites un insert, laissez les <; ne les transformez pas ! Car si vous lez voulez plus tard comme ca, vous n'avez qu'à les demander, et si vous les voulez transformé, vous les transformez.)
aquewel Messages postés 143 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 6 juin 2010
10 août 2004 à 18:11
Grenard faut que tu m'aide ;-)

j'utlise ta class seulement j'ai une erreur que je comprends pas

Fatal error: Call to undefined function: transform_specialchars() in c:\ on line 68
jpabeille13 Messages postés 11 Date d'inscription vendredi 9 juillet 2004 Statut Membre Dernière intervention 27 septembre 2004
7 août 2004 à 18:50
de jpabeille13
Je pense comme toi Babid mais j'ai fait la remarque car de la part de GRenard qui râle toujours sur des détails c'est pas sérieux?.
cs_babid Messages postés 49 Date d'inscription dimanche 21 septembre 2003 Statut Membre Dernière intervention 17 décembre 2008
5 août 2004 à 16:14
Salut jpabeille13,

En fait je pense que transform_specialchars est une fonction que notre cher amis GRenard a omis de mettre dans le source, un oubli, une erreur ça arrive à tout le monde. Je pense que quand il lira ce post, il mettra à jour sa source !!
Enfin, je ne veux pas dire de bétise mais je pense que c'est une fonction qui utilise les fonctions htmlspecialchars() et/ou htmlentities(). Mais je pense que GRenard se fera un plaisir de nous expliquer cela en détail.

Bye
jpabeille13 Messages postés 11 Date d'inscription vendredi 9 juillet 2004 Statut Membre Dernière intervention 27 septembre 2004
5 août 2004 à 14:30
transform_specialchars ?? c'est quoi ??
cs_babid Messages postés 49 Date d'inscription dimanche 21 septembre 2003 Statut Membre Dernière intervention 17 décembre 2008
3 août 2004 à 08:57
Salut,

En effet GRenard, ta class est GENIALE.
L'avantage est sa portabilité, ceux qui est très important aujourd'hui car vu les variations de prix de certains hébergeurs, un patron peut vite changer d'avis et vous retrouver dans un belle MERD... si vous devez miger le code d'un hébergeur à un autre.
Petit bémol, à mon goût, c'est de faire une gestion des erreurs un peu plus poussé, comme par exemple, faire un envoie de mail a l'administrateur avec le détail des erreurs et affiché un message d'excuse pour l'internaute (il n'a pas besoin de connaitre le détail des erreurs) Il me semble qu'il y a une source à ce sujet, je cherche.
Voilà, ce n'est pas de moi, mais ca peut servir de début :
<?php
function debug_mysql()
{
$mail=true; // Si vous voulez qu'un mail vous soit envoyé en cas d'erreur (true
pour oui / false pour non

/* Affectation des lignes html du débug à la variable $debug */
$debug='
Erreur SQL !


';
$debug .='A la ligne '.__LINE__.' dans le fichier '.__FILE__;
$debug .='
MySQL a répondu : '.mysql_error();

echo '
Un mail a été envoyé à l\'administrateur pour corriger ce bug,
il sera réparé dans les plus brefs délais.
Merci de votre compréhension.'; // Affichage de l'erreur

mysql_close(); // Déconnexion de la BDD

if($mail)
{
/* Envoi du mail contenant l'erreur au format html */
$to = 'bistory1@hotmail.com'; // votre email
$sujet ='Erreur rencontrée lors de l\'exécution de '.__FILE__; // Sujet du mes
sage

$from ="From: $to \r\n";
$from .="Content-Type: text/html; charset=us-ascii\r\n"; // Définition du form
at html

if(!mail($to,$sujet,$debug,$from))
{
echo 'Problème lors de l\'envoi du mail';
}
}
}
?>
bon ca vaut ce que ca vaut mais l'idée est là.


Bonne continuation


PS: déolé GRenard j'ai voulu posté hier mais le site a planté.

Bye
Utilisateur anonyme
2 août 2004 à 17:19
Les possibiltés sont immenses! Merci.
Sinon, dans ta class, je rajouterai une fonction qui permet de savoir si un enregistrement est présent ou non. En effet la requête renvoie au minimum une ligne donc ta fonction sql_fetchrow ne permet pas de savoir si l'enregistrement est trouvé.
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
2 août 2004 à 16:47
Tu peux très bien...
Ton autre classe peut appeler des fonctions de cette classe.
Par exemple dans ton constructeur tu enregistre
$this->db = new mysql(....);

et dans une de TES fonctions tu peux faire
$this->db->sql_query(...);
Utilisateur anonyme
2 août 2004 à 15:54
Effectivement, cette class s'avère utile.
J'aimerai savoir si je peux, dans une autre class, faire des requete en me servant de cette class ?
cs_Zacland Messages postés 35 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 15 mai 2007
29 juil. 2004 à 11:08
Je rejoint Minta sur les critiques de GRenard qui poussent à être plus rigoureux en programmation, si ce n'est que je le trouve un peu "vient que j't'écrase" des fois, mais bon ... chacun son style :p

Merci pour la class GRenard. :)

-=Zac
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
24 juil. 2004 à 19:47
Ca doit dépendre du processeur je pense ;-)

Ceci n'enlève en rien de toute façon la qualité de cette classe.

Du beau boulot ;-)

Bye
cs_minta Messages postés 31 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 1 mai 2022
24 juil. 2004 à 17:55
Il faut croire que selon la configuration de votre serveur les données sont différentes. Pour un vrai test vous devez avoir exactement le meme système et etre dans les memes conditions. Enfin, vous disputez pour des différences aussi minimes, ce n'est pas sérieux pour des programmeurs de votre trempe. À GRenard j'aime bien tes critiques sur les différents postes et cela m'emmène à tendre vers une meilleure programmation.
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
24 juil. 2004 à 10:00
Je viens de faire des tests : 1 000 000 itérations * 10 et faire la moyenne sur une box linux hébergement profesionnel (woua c'est encore plus rapide que chez moi :P). Les valeurs sont données pour 1 000 000 d'itérations.

++ : 0.87569527272727 secondes
+= : 0.97009354545455 secondes

(Chez mon linux à moi 1ghz, j'atteignait 2 secondes, et sur mon Windows 800mhz, j'atteignais quasiment 3 secondes :P)

Tout ca pour dire que tu ne ma pas convaincu... Je trouve un écart beaucoup plus grand que le tiens (même avec 2 fois plus d'itérations) et il est pas dans le même sens...
(La box linux professionel est sur PHP4, mais même la, je ne crois pas que Zend2 ait changé grand chose pour PHP5 dans les ++ et +=)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
24 juil. 2004 à 08:28
heu mes tests étaient basés sur une boucle de 500.000 itérations et pas 50.000
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
24 juil. 2004 à 08:27
Je viens de faire des tests sous linux et y'a pas de différence notable (sur mon hébergement mutualisé)

Donc pour moi je garde +=1, en plus j'ai vu des sites d'optimisation php qui conseillent de mettre cette forme.

a ++
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
24 juil. 2004 à 08:23
Et bien j'ai fait des benchmarks sous windows (avec mon P4) et c'est beaucoup plus rapide de faire +=1

Pour linux je vais pas cramer le serveur mutualisé...

En tout cas chez moi +=1 est plus rapide (sur une boucle de 50000 itérations :

$i++ : 0.239 secondes
$i+=1 : 0.231 secondes

bien sûr j'ai pris la valeur la plus faible obtenue)

a ++
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
24 juil. 2004 à 01:15
Ta remarque ma fait énormément cherché... J'ai regardé dans mes 5 livres de programmation et il n'en parle pas.
Ils disent seulement que la compilation se fait un peu plus rapidement pour les formes abrégées ($test = $test + 1; mais plutot $test+=1)
J'ai alors fais des tests pour vérifier $a++; et $a+=1;
Figure toi que sous linux, il y a quand même une grande différence et c'est beaucoup plus rapide faire ++ que +=1; (sous Windows, c'est très instable)
Alors il faut me dire d'ou tu tiens tes sources. Car ++ est plus rapide que +=1; !
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
23 juil. 2004 à 23:03
Salut ;-)

juste un tout petit détail sans importance :

remplace $this->num_queries++; par $this->num_queries+=1;

C'est légèrement plus rapide.

Sinon pour le reste c'est du très bon ;-)

a ++
Rejoignez-nous