Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Base de données > Requête Préparée > Lecture des commentaires

Requête Préparée

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Pseudo Commentaire
Page : 1 
Hors ligne saturn1 # Posté le 07/12/2008 à 13:58:51 - Ce membre a mis la note : 16
Avatar
Groupe : Membres
Merci pour le tutorial je le lis car je veux comprendre la suite du tutoriel sur PDO.
Je me suis mis à PDO + POO d'un coup sa fait très mal mdr!!

Tu aimes le rap? C'est par ici :
Punchline
Tracker code bien? même très bien? C'est moi qui lui est tout appris...
Punchline -1% :D
 
Hors ligne Zopieux # Posté le 05/10/2008 à 20:04:08 - Ce membre n'a pas mis de note
it… it can't be true!
Avatar
Validateurs
Code : SQL
1
PREPARE test FROM 'SELECT * FROM matable WHERE ID = ? AND nombre > ?

Comme te le dit gentillement pygments (ou pas), il y a une erreur.

Code : SQL
1
PREPARE test FROM 'SELECT * FROM matable WHERE ID = ? AND nombre > ?';
 
En ligne mrjay42 # Posté le 07/09/2008 à 17:03:29 - Ce membre n'a pas mis de note
We gotta take the power back
Avatar
Groupe : Membres
Il manque clairement un exemple avec du code.

Exemple :
On appelle une methode ou une fonction qui retourne des infos sur une liste de personnes.
Et pour chaque Personnes retournées ont éxécutes une fonctions qui va chercher d'autres infos.
En gros on va faire un script dans ce style :
Code : PHP
1
2
3
4
5
6
7
8
9
<?php
//Execution d'une requete dans ce style :
$result = mysql_query("SELECT * FROM personne")
while($ligne = mysql_fetch_assoc($result) {

//execution d'une fonction qui va être appelée plusieurs fois : 
$personne->fonction_contenant_une_requete_qu_il_faudrait_preparer($ligne["ID"]);

}

Question OU faut-il faire le PREPARE ??
Dans la "fonction_contenant_une_requete_qu_il_faudrait_préparer();" ou avant de l'appeler ?
S'il faut préparer la requete dans la "fonction_contenant_une_requete_qu_il_faudrait_preparer();" ne va t'il pas y avoir X préparation ? => autant de fois que l'on appelle cette fonction?

Image utilisateur
 
Hors ligne Draeli # Posté le 27/08/2008 à 02:08:41 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Pour les sites ayant peu de visite je serai tenté de dire qu'à la limite la question se pose pas trop du coup. Par contre pour ce qui est des serveurs à forts trafic, effectivement ça fais partie des intérêts, sachant que le cache est limité de toute manière à une certaine taille et que le cache peut-être amené à tourner (dans le sens ou le cache ne reste pas le même tous le temps).

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne SpaceFox # Posté le 23/08/2008 à 11:33:49 - Ce membre n'a pas mis de note
Ton code existe deja, en mieux
Avatar
Groupe : Membres
Le tuto est intéressant, mais ça m'a l'air finalement assez peu utile en fin de compte.
Sur les tests que je viens de faire, j'en ai déduit les choses suivantes :

1- Effectivement à la première exécution du script, on y gagne (mais pas grand-chose) : [ Préparation + exécutions ] < [ Exécutions en masse ]

2- Aux exécutions suivantes, les requêtes sont déjà en cache et là, c'est le drame : les requêtes « normales » s'exécutent à la même vitesse que les requêtes préparées, sauf que pour une requête préparée il faut faire un SET, qui prend aussi du temps (ici, tous les temps dont je parle sont les « temps d'accès mémoire à un résultat connu », c'est presque fixe et sur mon PC en local ça vaut 0.5 ms).

3- De ces premiers points, j'en déduit que les requêtes préparées sont intéressantes (chose curieuse) sur un serveur très chargé ou sur un site avec peu de visites, i.e. quand les requêtes ne sont pas en cache.
Mais ça vient peut-être de ma requête qui ne s'y prête pas :
Code : SQL
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
PREPARE lister_persos FROM 'SELECT persos.id, persos.nom, persos.paragraphe_en_cours, aventures_persos.aventure, aventures_persos.etat
	FROM persos
	LEFT JOIN aventures_persos
		ON persos.id = aventures_persos.perso
	WHERE persos.membre = 1
		AND (
			(aventures_persos.etat IS NULL)
		OR (aventures_persos.etat = ''En Cours'' AND aventures_persos.aventure = ?)
		OR (aventures_persos.etat <> ''En Cours''
			AND persos.id NOT IN (	SELECT perso
						FROM aventures_persos
						WHERE (aventure = ?)
							OR (aventures_persos.perso = persos.id AND etat = ''En cours'')
						)
			)
		)
	GROUP BY persos.id'

Avec deux fois le même paramètre qui change à chaque itération.

4- Enfin :
Citation : Shepard
Et puis enfin, pour utiliser un prepared statement, on n'est pas _obligé_ d'utiliser une variable, ça marchera parfaitement si vous mettez
Code : SQL
1
EXECUTE req USING 'valeur';

Ceci ne fonctionne pas avec MySQL (d'ailleurs la doc est assez claire à ce sujet).

Citation : La doc en question
Parameter values can be supplied only by user variables

Par contre, je suppose que ça devrait fonctionner avec d'autres SGBD plus "intelligents".

Image utilisateur
Image utilisateur

Image utilisateur
 
Hors ligne Crew # Posté le 16/08/2008 à 01:31:24 - Ce membre n'a pas mis de note
Poulet avarié.
Avatar
Groupe : Bannis
Excellent tuto. :)
Hors ligne Ogoo # Posté le 16/08/2008 à 01:29:45 - Ce membre n'a pas mis de note
Pwned.
Avatar
Groupe : Membres
Très bon tutoriel. Merci à toi. ;)
Hors ligne Draeli # Posté le 12/08/2008 à 02:08:17 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
La définition que j'en donne est bonne dans ce contexte, sinon tu peux allé voir les gars de MySQL pour leur expliquer que ce sont des quiches ;)

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne kedare # Posté le 07/08/2008 à 04:28:20 - Ce membre n'a pas mis de note
I Hate PHP
Avatar
Groupe : Membres
Ton truc sur les Threads est totalement faux :
Citation : Tuto
Thread : on parle de thread (flux en Français) dans ce cas afin de désigner une session ouverte par un utilisateur. Cette session est régie par des règles qui dépendent des paramètres du serveur mais aussi des moteurs de stockages utilisés (sachant que ceci peut aussi être réglé au niveau du serveur).

Deja en francais, Thread -> Fil (Flux c'est Stream)
Ensuite un thread n'est pas une session mais une suite d'instruction exécuté independament, rien avoir donc (meme si un thread ou plusieurs sont créer a chaque nouvelle session)

"Toute technologie suffisamment avancée est indifférenciable de la magie" Arthur C. Clarke, “Profil de l’avenir”, 1961
Pseudo PSN: Kedare
Code Mii: 8684 6147 7730 6877

dev.Kedare Blog
 
Hors ligne TheDead Master # Posté le 05/08/2008 à 22:12:16 - Ce membre n'a pas mis de note
4 8 15 16 23 42
Avatar
Groupe : Membres
Citation : Draeli
un tutorial du zéro sur le Français et les 'astuces' comme pour le où/ou serait le bienvenue


Ça existe déjà : http://www.siteduzero.com/tuto-3-24568 [...] rancaise.html :p .

Je n'ai plus internet depuis septembre 2008 pour une durée indéterminée.

Comité de lutte contre le langage sms et les fautes volontaires sur Internet.
 
Hors ligne Draeli # Posté le 04/08/2007 à 12:20:47 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Vu que tu as pris le temps de lire et corriger, j'ai pris le temps d'aller modifier une partie de ce que tu as remonté comme erreurs. Les modifications seront donc effectives dés la validation d'un correcteur :)

Après coup je m'aperçois que :
1 : même quand on ce reli, en ayant le nez sur le texte des fois on rate des trucs horrifiants (typiquement le ez au lieu de é ...)
2 : un tutorial du zéro sur le Français et les 'astuces' comme pour le où/ou serait le bienvenue (pour le à/a je me souviens qu'il faut remplacer par 'avait' et que si ca choque l'oreille, on colle l'accent)
3 : il ne faut pas écrire du tuto sous perfusion de café (un peu comme aujourd'hui)

En tous cas, merci du temps que tu as passé dessus, par contre j'ai laissé certaines choses dedans n'étant pas tout à fais d'accord (comme le tous/tout (non, pas le chien :D) )

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne Jerry Wham # Posté le 14/06/2007 à 14:41:27 - Ce membre a mis la note : 10
1castorMangé,1arbreSauvé
Avatar
Groupe : Membres
Salut,

Ton tuto est bien expliqué et me sera surement utile dans un proche avenir.

Le seul bémol sont les fautes d'orthographe plus énormes les unes que les autres.
Il faudrait te relire avant de poster. Demande de l'aide aux zcorrecteurs si tu veux.

J'ai relevé, en première lecture, les plus énormes. Il se peut qu'il en reste. Tu devrais corriger.

Les voici.

Citation : TUTOTEUR
Lors de l'appel à cette fonction, plusieurs paramètres vont être fournis qui, s'ils sont correctes...


C'est masculin, donc pas de "e".

Citation : TUTOTEUR
...la connexion ce terminera soit...


Un "s" serait plus approprié.

Citation : TUTOTEUR
Ainsi durant cette intervalLE, si une requête ayant toujours le même aspect (dont seul les paramètres changent) est répétéE plusieurs fois...


Citation : TUTOTEUR
...ayant en identifiant du nom de 'test'...


"u" serait mieux non ?

Citation : TUTOTEUR
..dans le cas ou vous...


On ne peut pas le remplacer par "ou bien" car il n'indique pas une coordination. C'est donc "où" qu'il faut mettre.

Citation : TUTOTEUR
...(MySQL effectuE un DROP PREPARE ...


Citation : TUTOTEUR
...l'appel ce fera sous la même forme, la seulE différence étant...comprendra chaque variable séparéE par une virgule et le nombre de variableS devra être égal au nombre de ?.


Citation : TUTOTEUR
...en manipulant des sessions afin de voir exactement ce qu'il ce passe et permettra à ceux n'ayant pas tous compris de lever le voile à travers une manipulation qui se veux simple mais néanmoins complète.


Même remarque que précédemment : "se" et non "ce", "tout" et non "tous", "veut" et non "veux"

Citation : idem
La si vous avez effectué correctement la manipulation,...la forme : mysql>, ce prompt est juste la comme point de repère...



"là" et non "la".

Citation : IDEM
...le prompt à changé :) ...


Là, c'est l'inverse (a au lieu de à).

Citation : idem
...cela vous indique que vous avez deux sessions de lancéEs...la base de données ou ce trouve l'utilisateur...qui vous permet de voir le session qui a effectué le SHOW processlist;. A ce stade la nous voyons que chaque session...


"où", "se" et "là".

Citation : idem
Ceci nous a permis de créer une base de données appeléE world et de ce rendre dessus. ...ouvrez le répertoire ou il est stocké. ...Maintenant, tapez => source mais sans valider puis faite glisser le fichier world.sql dans la fenêtre ou vous avez tapez ceci... les tables et les enregistrements sont en cours de créations (pas de "s" ici). Nous allons vérifier que tous c'est bien passé en tapant ceci :SHOW TABLES la vous aurez 3 tables si tous c'est déroulé correctement (de toute façon dans le cas contraire vous aurez 1-N bips vous signalant des erreurs, ce en quoi (?) vous avez fais une mauvaise manipulation).


Citation : idem
Mettez vous sur l'une des deux fenêtreS sur laquelLE vous resterez...Vous pouvez bien sur remplacer ...Ainsi une fois que vous aurez modifiez la variable à l'aide de SET,...ceci est dû au fait que la requête préparée demandéE n'est pas trouvée.


Citation : idem
Cette partie est la afin de développer tous les termes qui peuvent paraître obscurS de prime abord...Cette session est régit...(sachant que ceci peux (ceux-ci peuvent) aussi être régléS au niveau du serveur)....Ses moteurs ont des caractéristiques qui leurs sont propres et qui devront être choisiS ...Les spécificitées de chaque moteur sera fait(seront traitées) dans un futur tutorial pour des raisons pratiques... afin de désigner les processus sans interface et qui ne proposeNT comme...Les variables à portées globales, qui sont désignéEs par @@ et les variables à portées de sessions, qui comme le nom l'indique ne sont valableS que dans l'espace de la session et qui peuvent donc varier d'une connexion à l'autre....alors il sera (saura) qu'il a 2H d'avance...ce type de requêtes peux s'avérer trés utile quand il s'agit d'optimiser des requêtes qui seront appeléEs plusieurs fois durant la session d'un utilisateur mais que (dont)l'usage reste restreint.


Voilà. J'espère que tu corrigeras car ton tuto n'en sera que meilleur.

Je te mets 18 pour le tuto mais j'enlève 8 points pour l'orthographe, ce qui te fait 10.

A plus. :p
 
Hors ligne thib # Posté le 20/05/2007 à 16:53:54 - Ce membre a mis la note : 15
Apprenti Linuxien
Avatar
Groupe : Membres
Bon tuto, j'ai mis 15, seulement je ne comprend pas bien en quoi les requêtes préparées permettent d'éviter les injections sql? :o De plus je ne vois pas quel est l'avantage d'utiliser les requêtes préparées si comme le dit sherpard mysql automatise les requêtes tout seul lorsqu'on les répète? :euh: Voilà, merci d'avance... :p

Image utilisateur
 
Hors ligne Gaga971 # Posté le 28/04/2007 à 15:30:02 - Ce membre a mis la note : 17
Programmeur indépendant
Avatar
Groupe : Membres
C'est super!!!!!Un tres bon tutorial que j'avais plusieurs fois traversé mais jamais j'ai pris mon temps pour le lire.
Et là ben je trouve cela très bien expliquén dommage que l'on traite pas les connection persistante qui m'interesse bcp :(

Je met 17/20 ;)


 
Hors ligne Chaoxys # Posté le 19/11/2006 à 13:08:24 - Ce membre n'a pas mis de note
Gros zéro :p
Avatar
Groupe : Membres
Bon tuto !
Hors ligne galize # Posté le 24/08/2006 à 12:17:01 - Ce membre a mis la note : 20
Zut
Groupe : Membres
Clair et concis.

Galize
 
Hors ligne Awaken # Posté le 13/08/2006 à 11:58:11 - Ce membre a mis la note : 17
Avatar
Groupe : Membres
Assez bon tuto, cependant tu aurais pu montrer un exemple dans un page web parce que je comprend pas très bien un truc :

Par exemple, sur toutes les pages de mon site je fais une requête sur la personne connectée

Code : PHP

$sql = 'SELECT * FROM users WHERE userid = ' . $_SESSION['userid'];


Comme cette requête est répétée beaucoup de fois, il serait bien d'en faire une requête préparée mais je vois pas comment. Dans le header je mettrai un PREPARE xxx FROM et ensuite un EXECUTE ?

Je sais pas si tu comprends ma question^^

The greatest trick the Devil ever pulled was convincing the world he didn't exist.
 
Hors ligne Draeli # Posté le 21/07/2006 à 16:58:26 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Pour mysqli je ne vois pas ce à quoi tu fais référence, il me faudrait un lien vers ce dont tu parles pour te dire.
Sinon pour Php5, tu disposes désormais de l'extension PDO qui elle inclu aussi un principe de requête préparé (ca dépend aussi du drivers lié au SGBD).

Pour les ?, tu peux en mettre plusieurs. Lors de l'appel d'une requête, tu devras séparer les variables par une virgule et mettre autant de variable qu'il y a de ?.

Edit : j'ai fais une mise à jour du tuto pour répondre à la question, en attente de la validation.

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne Lord Katen # Posté le 20/07/2006 à 15:27:03 - Ce membre n'a pas mis de note
It ain't over 'til it's over.
Avatar
Groupe : Membres
Il me semble que l'extension mysqli dispose de fonctions toutes pretes pour exploitées les possibilitées des requetes préparées, j'ai lu ca dans php5 avancé

World Company 2
Think ! It's not illegal yet.
 
Hors ligne Gectou4 # Posté le 18/07/2006 à 12:11:39 - Ce membre a mis la note : 16
Daijobu ka ?
Avatar
Groupe : Membres
bien simpa mais là je me pose une question que beacoup doivent ce posé si il débute d'ailleur

tu met un ? pour d'ésigner une variable, et si je dois mêtre deux variable ou plus dans ma requête ?
je met x point d'intergoation ?

qu'elle sera alors l'assignation logique ?

(sinon il me semble que session c'est féminin ^^)

tuto très intéréssant :)

Citation : Moi même
Mateo ... Poil au Zéro ! :D

Image utilisateur
Image utilisateur
 
Hors ligne Draeli # Posté le 29/05/2006 à 13:51:50 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Je n'ai pas parlé de connexion persistante car ce concept est abstrait pour MySQL dans la mesure ou c'est l'application appellante (terme qui se veux ici générique et qui prend par exemple en compte le mysql_connect de php (exemple parmis tant d'autres)) qui défini le moment de connexion et d'interruption.

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne infotoubib # Posté le 19/05/2006 à 21:38:57 - Ce membre a mis la note : 18
Avatar
Groupe : Membres
Merci pour ce tuto que je trouve très clair...
Je garde cela en mémoire pour des applications utilisant beaucoup la base de données, pas forcément en PHP d'ailleurs...

http://si2ra.ouvaton.org : Si2Ra, un CMS francophone pensé pour les intranets
 
Hors ligne Shepard # Posté le 11/05/2006 à 07:46:59 - Ce membre a mis la note : 15
SQL Beginner ...
Avatar
Groupe : Membres
Bon tuto ( à part pour les fautes d'orthographe :p ;) )

Par contre il faudrait peut-être penser à ajouter une note sur les connections persistantes ? ( bien pratiques dans ce cas ci justement ).

Mais si tu le fais, pense à signaler que toutes les variables de l'ancienne session sont gardées et qu'il ne faut pas s'y fier ( il faut faire un Code : SQL
SET @var = 0
et pas directement un Code : SQL
IF( @var IS NULL, @var := 1, @var := @var + 1 )
, car sinon la variable vaudra peut-être 28408 dès la première itération, alors qu'on voudrait commencer à 1 ... )

Sinon il faut aussi savoir que MySQL optimise automatiquement les requêtes appelées plusieurs fois, donc bon pas d'inquiétudes ;) :)

Et puis enfin, pour utiliser un prepared statement, on n'est pas _obligé_ d'utiliser une variable, ça marchera parfaitement si vous mettez Code : SQL
EXECUTE req USING 'valeur';


Bon tuto ;) J'ai mis 15 :)
Hors ligne Draeli # Posté le 14/04/2006 à 23:05:23 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Oui il y a bien optimisation mais sous certaines conditions comme c'est expliqué.
A savoir que plus une requête est appellé souvent et plus ca a d'intérêt, avec cependant un bémol du au faite que cela ne sert que pour une session donné.
Ainsi tous reste à savoir dans quel cadre on veux l'utiliser sinon il reste les procédures stockés dont je dois rédiger un tuto quand j'aurais un peu de temps.

Indépendant : Jedi PHP (Certifié Zend PHP) - Jedi MySQL (Certifié MySQL Core) - Jedi CSS
Le côté obscur de la force bientôt rejoins ai-je ! :-°
- A bove ante, ab asino retro, a stulto undique caveto -
 
Hors ligne Kermi # Posté le 11/04/2006 à 23:09:54 - Ce membre n'a pas mis de note
www.puissancejeunz.fr
Avatar
Groupe : Membres
il y a un truc que j'ai pas compris :

cela baisse t-il le nombre de requêtes (=optimisation) ???

je ne note pas car j'ai regardé vite fait, mais ca m'as pas l'air mal... si il y aurai des favoris coté tutos je le stockerai pour le lire tranquille demain, bah ca sera en bordel dans les marque pages :p

++

Image utilisateur
Image utilisateur
 
Hors ligne DeHix # Posté le 21/02/2006 à 11:03:07 - Ce membre a mis la note : 17
Ce serait bien si j'en avais..
Avatar
Groupe : Membres
assez bon tuto 17/20

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 437 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0515s (0.0391s)