Seu PDO está configurado para emular consultas preparadas, enquanto o mysqli está usando consultas preparadas verdadeiras.
A consulta preparada vincula a string
''1''
como um valor de parâmetro inteiro. O PHP o força para um inteiro usando algo como intval()
. Qualquer string com caracteres iniciais não numéricos é interpretada como 0 pelo PHP, então o valor do parâmetro enviado depois prepare é o valor 0. A consulta preparada falsa usa interpolação de string (em vez de vincular) para adicionar a string
''1''
na consulta SQL antes O MySQL o analisa. Mas o resultado é semelhante, porque o SQL também trata uma string com caracteres não numéricos em um contexto inteiro como o valor 0. A única diferença é o que acaba no log de consulta geral quando o parâmetro é vinculado antes da preparação versus depois da preparação.
Você também pode fazer o PDO usar consultas preparadas de verdade, então ele deve agir como mysqli neste caso:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:Isso pode demonstrar uma boa razão pela qual é costume iniciar os valores de id em 1 em vez de 0.