Su PDO está configurado para emular consultas preparadas, mientras que mysqli usa consultas preparadas verdaderas.
La consulta preparada vincula la cadena ''1''
como un valor de parámetro entero. PHP lo coacciona a un número entero usando algo como intval()
. PHP interpreta cualquier cadena con caracteres iniciales no numéricos como 0, por lo que el valor del parámetro se envía después preparar es el valor 0.
La consulta preparada falsa usa interpolación de cadenas (en lugar de enlazar) para agregar la cadena ''1''
en la consulta SQL antes MySQL lo analiza. Pero el resultado es similar, porque SQL también trata una cadena con caracteres iniciales no numéricos en un contexto de enteros como el valor 0.
La única diferencia es lo que termina en el registro general de consultas cuando el parámetro se vincula antes de la preparación y después de la preparación.
También puede hacer que PDO use consultas reales preparadas, por lo que debería actuar como mysqli en este caso:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PD:Esto puede demostrar una buena razón por la cual es habitual comenzar los valores de identificación en 1 en lugar de 0.