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.