Votre PDO est configuré pour émuler des requêtes préparées, alors que mysqli utilise de vraies requêtes préparées.
La requête préparée lie la chaîne ''1''
sous la forme d'une valeur de paramètre entière. PHP le contraint à un entier en utilisant quelque chose comme intval()
. Toute chaîne avec des caractères de début non numériques est interprétée comme 0 par PHP, donc la valeur du paramètre est envoyée après préparer est la valeur 0.
La fausse requête préparée utilise l'interpolation de chaîne (au lieu de lier) pour ajouter la chaîne ''1''
dans la requête SQL avant MySQL l'analyse. Mais le résultat est similaire, car SQL traite également une chaîne avec des caractères de tête non numériques dans un contexte d'entier comme la valeur 0.
La seule différence est ce qui se retrouve dans le journal général des requêtes lorsque le paramètre est lié avant la préparation par rapport à après la préparation.
Vous pouvez également faire en sorte que PDO utilise de vraies requêtes préparées, il devrait donc agir comme mysqli dans ce cas :
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS :Cela peut démontrer une bonne raison pour laquelle il est habituel de commencer les valeurs d'id à 1 au lieu de 0.