requête préparée avec ? qui ne fonctionne pas

Petit nouveau ! | 1 Messages

19 mars 2017, 21:37

bonjour,

Code : Tout sélectionner

$sup = $bdd->prepare(' DELETE FROM news WHERE type=? LIMIT 2'); $sup->execute(array($type));
la requette ci dessus fonctionne : elle efface les 2 plus anciennes données de ma bdd qui correspondent au 'type' qui a été déterminé dans un formulaire et enregistré dans la variable $type

VOICI mon PROBLEME :

Code : Tout sélectionner

$sup = $bdd->prepare(' DELETE FROM news WHERE type=? LIMIT ?'); $sup->execute(array($type,$num));
cette requete ne fonctionne pas quand je fixe la LIMIT avec un ? qui sera renseigné dans le même formuliare ... :(

Mammouth du PHP | 788 Messages

19 mars 2017, 21:43

possible qu'il ne soit pas possible de passer ainsi le paramètre du limit, il faut donc faire :
$sup = $bdd->prepare("DELETE FROM news WHERE type=? LIMIT $num");
en ayant au préalable vérifier le contenu de $num

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7124 Messages

19 mars 2017, 22:40

La raison est un peu bizarre, mais c'est logique que ça ne fonctionne pas avec LIMIT

En réalité, quand on utilise PDO::execute() les paramètres qui sont injectés le sont sous la forme de chaine de caractères c'est à dire avec des guillemets et donc ta requête devient :
DELETE FROM news WHERE type='toto' LIMIT '2'
Ce qui n'est pas correcte.

La solution est d'utiliser bindValue() en précisant que le paramètre est un entier pour que la variable soit passée sans guillemet
$bdd->bindValue('limit_val', $num, PDO::PARAM_INT);
Quand tout le reste a échoué, lisez le mode d'emploi...