Der er en lille ting at nævne. Som standard emulerer PDO kun forberedte sætninger.
Og mens den er i emuleringstilstand, kører den den samme gamle forespørgsel uden egentlig at forberede en enkelt sætning :)
Så først og fremmest
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
at slå rigtige forberedte udsagn til.
Der er en anden lille ting at nævne.
Desværre er der meget få rigtige viden i verden. Og især i verden af Q&A sites. Folk har en tendens til at gentage den information, de havde læst og fundet fornuftige. Uden at køre nogen test for at bevise eller endda uden at lægge hænderne på. Så "ofte bemærket" bør slet ikke betragtes som en pålidelig kilde.
Tilbage til sagen:selvom der burde være en eller anden straf, burde den være ubetydelig det meste af tiden. Hvis det er det - skal du tune dit system op.
Anyway, i emuleringstilstanden fik du det både "hurtigt" og sikkert.
Opdater
Nå, efter at have kørt dine test på mine data, må jeg sige, at der er noget galt med din database, hvis du har 3 gange forskel på et stort datasæt.
For en lynforespørgsel
select title from Board where id = 1
resultater er
emulation on off
query 0.07 0.130
prepare 0.075 0.145
mens for den ret byrdefulde forespørgsel
select title from Board where id > 1
resultater er
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Så, som vi kan se, bliver forskellen umærkelig på et stort datasæt.
For lynforespørgslen er der en vis forskel, men da det kun tager 0.0003. fraktion af sekund (for en enkelt forespørgsel) - vil jeg sige, at det er et perfekt eksempel på ordet "ligegyldighed".
For de lige resultater mellem query()/prepare() - Jeg har kun én idé - PDO bruger prepare/execute til alle forespørgsler, også dem uden bindinger.
Nu til kodningsproblemet.
Ja, underligt GBK-problem påvirker PDO for versioner før 5.3.3. Disse versioner havde ingen mulighed for at indstille den korrekte kodning og var uundgåelige sårbare (i emuleringstilstand). Men siden 5.3.3 PDO understøtter indstilling af kodning i DSN, og nu er alt i orden.
For mysqli skal man bruge mysqli_set_charset()
til netop dette formål med det samme (uigennemtrængelige) resultat.
I min egen klasse, som er baseret på mysqli, bruger jeg min egen pladsholderimplementering og bruger slet ingen forberedte udsagn. Ikke af præstationsmæssige årsager, men for bedre pålidelighed.