Er is één klein ding om op te noemen. Standaard emuleert PDO gewoon voorbereide instructies.
En terwijl het in emulatiemodus is, voert het dezelfde oude query uit zonder daadwerkelijk een enkele verklaring voor te bereiden :)
Dus, ten eerste,
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
om echte voorbereide verklaringen aan te zetten.
Er is nog iets kleins om op te noemen.
Helaas zijn er maar heel weinig echte kennis ter wereld. En vooral in de wereld van Q&A-sites. Mensen hebben de neiging om de informatie te herhalen die ze hadden gelezen en redelijk vonden. Zonder enige tests uit te voeren om het te bewijzen of zelfs zonder hun handen op te leggen. Dus "vaak opgemerkt" moet helemaal niet als een betrouwbare bron worden beschouwd.
Terug naar de zaak:hoewel er een straf zou moeten zijn, zou deze meestal onbeduidend moeten zijn. Als dat zo is, moet u uw systeem afstellen.
Hoe dan ook, in de emulatiemodus heb je het zowel "snel" als veilig.
Bijwerken
Nou, na het uitvoeren van uw tests op mijn gegevens, moet ik zeggen dat er iets mis is met uw database als u 3 keer verschil heeft op een grote dataset.
Voor een bliksemverzoek
select title from Board where id = 1
resultaten zijn
emulation on off
query 0.07 0.130
prepare 0.075 0.145
terwijl voor de nogal lastige vraag
select title from Board where id > 1
resultaten zijn
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Dus, zoals we kunnen zien, wordt het verschil op een grote dataset onmerkbaar.
Voor de bliksemzoekopdracht is er enig verschil, maar aangezien er slechts 0,0003 fractie van de seconde nodig is (voor een enkele vraag), zou ik zeggen dat dit een perfect voorbeeld is voor het woord "onverschilligheid".
Voor de gelijke resultaten tussen query()/prepare() - ik heb maar één idee - PDO gebruikt prepare/execute voor alle queries, zelfs die zonder bindingen.
Nu naar het coderingsprobleem.
Ja, vreemd GBK-probleem heeft invloed op PDO voor versies ouder dan 5.3.3. Deze versies hadden geen manier om de juiste codering in te stellen en waren onvermijdelijk kwetsbaar (in emulatiemodus). Maar aangezien 5.3.3 PDO het instellen van codering in DSN ondersteunt, en nu is alles in orde.
Voor mysqli moet men mysqli_set_charset()
gebruiken voor dit doel met hetzelfde (ondoordringbare) resultaat.
In mijn eigen klas die is gebaseerd op mysqli, gebruik ik mijn eigen placeholder-implementatie en gebruik ik helemaal geen voorbereide uitspraken. Niet om prestatieredenen, maar voor een betere betrouwbaarheid.