sql >> Databáze >  >> RDS >> Mysql

PDO odešle nezpracovaný dotaz do MySQL, zatímco Mysqli odešle připravený dotaz, oba produkují stejný výsledek

Vaše PDO je nakonfigurováno tak, aby emulovalo připravené dotazy, zatímco mysqli používá skutečně připravené dotazy.

Připravený dotaz váže řetězec ''1'' jako celočíselnou hodnotu parametru. PHP to převede na celé číslo pomocí něčeho jako intval() . Jakýkoli řetězec s nečíselnými znaky na začátku je PHP interpretován jako 0, takže hodnota parametru odeslaná po připravit je hodnota 0.

Falešný připravený dotaz používá řetězcovou interpolaci (místo vazby) přidejte řetězec ''1'' do dotazu SQL před MySQL to analyzuje. Ale výsledek je podobný, protože SQL také zachází s řetězcem s nečíselnými úvodními znaky v celočíselném kontextu jako s hodnotou 0.

Jediný rozdíl je v tom, co skončí v obecném protokolu dotazů, když je parametr svázán před přípravou a po přípravě.

Můžete také přimět PDO používat skutečné připravené dotazy, takže by se v tomto případě mělo chovat stejně jako mysqli:

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

PS:To může demonstrovat dobrý důvod, proč je obvyklé začínat hodnoty id na 1 namísto 0.




  1. Chyba převodu pole na řetězec PDO

  2. Složitý COUNT dotaz v MySQL

  3. Jak začít s SQL Serverem v Azure

  4. MySQL Group By pro zobrazení nejnovějšího výsledku