PDO requete préparé

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PDO requete préparé

Re: PDO requete préparé

par foetus69 » 17 août 2015, 22:38

Ah ah j'adore ! un post vaut mieux que 1000 pages sur la toile, merci Genova :)

Re: PDO requete préparé

par Genova » 17 août 2015, 18:11

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é

par foetus69 » 17 août 2015, 16:43

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é

par Genova » 17 août 2015, 02:37

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);
}

PDO requete préparé

par Chaya » 17 août 2015, 00:43

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...