Din PDO är konfigurerad för att emulera förberedda frågor, medan mysqli använder riktiga förberedda frågor.
Den förberedda frågan binder strängen ''1''
som ett heltalsparametervärde. PHP tvingar det till ett heltal med något som intval()
. Alla strängar med icke-numeriska inledande tecken tolkas som 0 av PHP, så parametervärdet skickas efter prepare är värdet 0.
Den falska förberedda frågan använder stränginterpolation (istället för att binda) för att lägga till strängen ''1''
i SQL-frågan före MySQL analyserar det. Men resultatet är liknande, eftersom SQL också behandlar en sträng med icke-numeriska inledande tecken i ett heltalssammanhang som värdet 0.
Den enda skillnaden är vad som hamnar i den allmänna frågeloggen när parametern är bunden före preparering kontra efter preparering.
Du kan också få PDO att använda riktiga förberedda frågor, så det bör fungera precis som mysqli i det här fallet:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:Detta kan visa på en bra anledning till varför det är vanligt att börja id-värden på 1 istället för 0.