Page 1 sur 1

PDO requete préparé

Posté : 17 août 2015, 00:43
par Chaya
Bonjour,
J'ai un peu de mal a comprendre la différence entre les différentes méthodes pour faire une requête préparé.
Lorsque l'on appelle notre fonction prepare(), les noms des champs que nous souhaitons "préparé" doivent être indiqué par un point d'interrogation ? ou par des marqueurs du genre "SELECT * FROM ma_table WHERE champ = :champ", je ne comprend pas quelle est la différence entre les 2, quelle est la meilleure façon de faire ? et est-ce obligatoire d'utiliser la méthode bindValue() ou peut ont passer directement un array dans la méthode execute ?
Merci d'avance...

Re: PDO requete préparé

Posté : 17 août 2015, 02:37
par Genova
Les marqueurs sont mieux que les "?". Le problème des "?" c'est qu'il faut ensuite que tu assignes les paramètres dans le même ordre que celui des "?" de la requête. Donc c'est nul, ce n'est pas clair et puis à la moindre modification de la requête tu devras réordonner tes paramètres.

Exemple typique de requête préparée :
$stmt = $pdo->prepare('SELECT * FROM table WHERE id = :id');
$stmt->execute([
   ':id' => 42,
]);

foreach ($stmt->fetchAll() as $row)
{
   var_dump($row);
}

Re: PDO requete préparé

Posté : 17 août 2015, 16:43
par foetus69
Salut Genova,

Ce post se recoupe avec le mien : mysqli > pdo ?

La version non protégée serait select * from table where id = 42 ?

Dans ton exemple les injections sont impossibles ? Un marqueur peut se déclarer et s'appeler dans n'importe quel ordre ? toujours avec : obligatoire ?

Merci de ton aide :)

Fée

Re: PDO requete préparé

Posté : 17 août 2015, 18:11
par Genova
La version non protégée c'est de faire quelque chose comme ça :
$pdo->prepare('SELECT * FROM table WHERE id = '.$_GET['id']);
Parce qu'il est possible, si ta variable est mal protégée, de faire de l'injection SQL (avec l'exemple ci dessus, il suffit de mettre du SQL dans l'URL pour créer une injection).

En fait le but des requêtes préparées à la base n'est pas lié à la sécurité. L'intérêt de ces requêtes c'est que c'est un tout petit plus performant si tu utilises plusieurs fois de suite la même requête, en changeant simplement le paramètre.
Le côté sécurisé est un petit plus dont on aurait tort de se priver. Il n'y a pas d'injection SQL possible en utilisant les paramètres.

Les paramètres nommés du genre :nomDuParametre ont l'intérêt comme leur nom l'indique d'être nommé, donc ensuite il te suffit de faire ça :
$stmt->execute([
   ':nomDuParametre' => 42,
]);
Alors que les paramètres avec un "?", comme ils ne sont pas nommés, doivent être assignés dans le même ordre que celui de la requête. Bref en gros n'utilise pas les "?", ça n'a aucun avantage par rapport aux paramètres nommés ;)

Re: PDO requete préparé

Posté : 17 août 2015, 22:38
par foetus69
Ah ah j'adore ! un post vaut mieux que 1000 pages sur la toile, merci Genova :)