Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O PDO envia a consulta bruta para o MySQL enquanto o Mysqli envia a consulta preparada, ambos produzem o mesmo resultado


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.