sql >> Database >  >> RDS >> Mysql

PDO stuurt onbewerkte query naar MySQL terwijl Mysqli voorbereide query verzendt, beide produceren hetzelfde resultaat

Uw PDO is geconfigureerd om voorbereide zoekopdrachten te emuleren, terwijl mysqli echte voorbereide zoekopdrachten gebruikt.

De voorbereide query bindt de string ''1'' als een integer parameterwaarde. PHP dwingt het tot een geheel getal met iets als intval() . Elke tekenreeks met niet-numerieke voorlooptekens wordt door PHP als 0 geïnterpreteerd, dus de parameterwaarde wordt na verzonden voorbereiden is de waarde 0.

De nep-voorbereide zoekopdracht maakt gebruik van tekenreeksinterpolatie (in plaats van bindend) om de tekenreeks ''1'' . toe te voegen in de SQL-query voor MySQL ontleedt het. Maar het resultaat is vergelijkbaar, omdat SQL ook een string met niet-numerieke voorlooptekens in een integer-context behandelt als de waarde 0.

Het enige verschil is wat er in het algemene querylogboek terechtkomt wanneer de parameter wordt gebonden vóór voorbereiding versus na voorbereiding.

Je kunt PDO ook echt voorbereide zoekopdrachten laten gebruiken, dus het zou in dit geval net als mysqli moeten werken:

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

PS:Dit kan een goede reden zijn waarom het gebruikelijk is om ID-waarden te beginnen bij 1 in plaats van 0.




  1. bind_param problemen

  2. Hoe kan ik detecteren dat een query voor maken, bijwerken en verwijderen succesvol is in Codeigniter?

  3. Hoe rijen uit twee tabellen in één query te tellen?

  4. Android Sqlite-prestaties