[RESOLU] bindValue ou bindParameter - différence?

Eléphant du PHP | 55 Messages

15 oct. 2013, 23:48

Bonjour,
J'ai utilisé PDO et des requêtes préparées du type:
$requete=$bdd->prepare("UPDATE jeux SET intitule_jeu=:intitule,descriptif=:descriptif,date=:date WHERE id_jeux=:id");
		$requete->execute(array(
				  ':intitule'=>$intitule,
				  ':descriptif'=>$descriptif,
				  ':date'=>$date,
				  ':id'=>$id));

A plusieurs reprises, j'ai lu des codes où les values étaient soit avec des bindValue comme dans l'exemple ci-dessous:
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < ? AND couleur = ?');
$sth->bindValue(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $couleur, PDO::PARAM_STR);
$sth->execute();
ou des bindParam
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < :calories AND couleur = :couleur');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12);
$sth->execute();
Je voudrais savoir s'il était nécessaire pour éviter des attaques ou injections que je renforce mes requêtes préparées ou bien en sont-elles intrinsèquement protégées?
L'utilisation des bind est-elle essentielle ou les requêtes préparées suffisent-elles?
Et peut-on utiliser les post au lieu de variables($calories = 150;) avec les bind?
Et je ne vois pas la différence entre les 2 bind. La nomenclature n'est pas assez précise.

Merci par avance pour vos réponses.
Cdlt,
Ionesco

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 oct. 2013, 07:28

Salut,

Dans l'desordre :

Les requêtes préparées font par défaut une "protection" des données.
Mais généralement elles sont utilisée a tort et à travers seulement pour cela alors que le but c'est quand même de precompiler la requête sur le serveur pour l'exécuter x fois a la suite (en boucle quoi).
Par défaut le driver mysql ne fait pas de "vrai" requête préparée c'est juste une émulation.
Tu peux très bien utiliser la méthode quote pour ce qui est de la "protection" des données.


Pour ce qui est de la différence entre les méthodes la doc te dit que
Lie une variable PHP à un marquer nommé ou interrogatif correspondant dans une requête SQL utilisée pour préparer la requête. Contrairement à PDOStatement::bindValue(), la variable est liée en tant que référence et ne sera évaluée qu'au moment de l'appel à la fonction PDOStatement::execute().
L'un fait une référence de variable du coup change la variable dans le boucle et c'est la valeur au moment de l'exécute qui compte.
L'autre prend la valeur au moment de sont appel.

@+
Il en faut peu pour être heureux ......