8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je débute dans le pdo, et certains membre du forum m'ont aidé dans mon code. On me parle de requêtes préparées, ou les utilises quand ?

Pour interroger la bdd avec le remplissage d'un champ ou pour renter de la donnée ?

J'ai du mal à piger le truc. J'ai bien le tuto du site :
https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/lire-des-donnees-2


mais c'est pas très clair dans mon esprit : query et prepare

Le code fonctionne mais j'aimerai savoir ce qui est le mieux à coder pour être tranquille. Préparées ou pas ?

Le but est d'apprendre pour éviter d'ennuyer le monde à chaque problème ...

Merci d'avance de vos explications. Si vous avez des tutos, je suis preneur.

J'adore apprendre Smiley lol
Modifié par Tintin75 (24 Jan 2016 - 14:56)
salut,
les requêtes préparées sont utilisées dans le but de figer une requête afin de la réutiliser plus tard dans ton code.
La requête est ainsi compiler et analysée une seule fois par ta bdd. Elles permettent donc d'optimiser les requêtes redondantes et surtout d'éviter les injections SQL.

Si par exemple tu comptes récupérer de la même table les mêmes informations plusieurs fois dans ton application et qui ne varieront que par l'identifiant primaire (par exemple), il est préférable (voir même logique) de créer une requête préparée que tu exécuteras par la suite en indiquant le paramètre qui varie :

SELECT nom, prenom FROM table WHERE id = ?

Ici, le point d'interrogation signifie que c'est ce paramètre qui variera.
En PDO, ça donne donc :

$req = $db->prepare("SELECT nom, prenom FROM table WHERE id = ?");
$req->execute(array($ton_id));

en supposant que la variable $db contienne ton objet PDO qui te permet de te connecter à ta BDD.

Étant donné que la requête préparée est déjà créer avant son exécution, il devient aussi impossible d'injecter un code SQL.
Pour toute donnée récupérée dynamiquement, via un formulaire par exemple, où tu permet à l'utilisateur d'interagir directement avec ta bdd, tu dois à tout prix utiliser les requêtes préparées pour introduire les paramètres variables.

L'avantage qu'a PDO est d'offrir des paramètres nommés. C'est à dire qu'au lieu de ne spécifier que des ? pour indiquer les paramètres variables, tu peux explicitement les désigner :

$req = $db->prepare("SELECT nom, prenom FROM table WHERE id = :id AND nom = :nom");
$req->execute(array(
   "id" => $ton_id,
   "nom" => $un_nom_cible
));


Tu peux même aller plus loin en ayant un contrôle sur les paramètres variables grâce à bindParam et bindValue. Tu pourras ainsi spécifier le type du paramètre variable voir même sa longueur (voir les exemples données dans les liens).


Pour les requêtes non préparées, il suffit donc d'utiliser query. Avec cette méthode, tu exécutes une requête à l'instant où tu fais appel à query.
Si ta requête est unique alors autant passer directement par query.
Merci beaucoup pour tes explications.

J'ai compris le but de la manip.

Je te souhaite un bon dimanche, et merci encore avoir pris le temps de m'expliquer.