sql >> Database teknologi >  >> RDS >> Mysql

PDO sender rå forespørgsel til MySQL, mens Mysqli sender forberedt forespørgsel, begge giver det samme resultat

Din PDO er konfigureret til at efterligne forberedte forespørgsler, hvorimod mysqli bruger ægte forberedte forespørgsler.

Den forberedte forespørgsel binder strengen ''1'' som en heltalsparameterværdi. PHP tvinger det til et heltal ved at bruge noget som intval() . Enhver streng med ikke-numeriske foranstående tegn fortolkes som 0 af PHP, så parameterværdien sendes efter forberede er værdien 0.

Den falske forberedte forespørgsel bruger strenginterpolation (i stedet for at binde) for at tilføje strengen ''1'' ind i SQL-forespørgslen før MySQL analyserer det. Men resultatet er det samme, fordi SQL også behandler en streng med ikke-numeriske foranstående tegn i en heltalskontekst som værdien 0.

Den eneste forskel er, hvad der ender i den generelle forespørgselslog, når parameteren er bundet før forberedelse versus efter forberedelse.

Du kan også få PDO til at bruge rigtige forberedte forespørgsler, så det skal fungere ligesom mysqli i dette tilfælde:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

PS:Dette kan vise en god grund til, at det er sædvanligt at starte id-værdier ved 1 i stedet for 0.




  1. Kan ikke oprette forbindelse til MySQL 4.1+ ved hjælp af gammel godkendelse

  2. Sådan indsætter du værdier i en tabel med dynamiske kolonner Jdbc/Mysql

  3. AWS Python Lambda med Oracle

  4. Lær om sammenkædning i SQL med eksempler