C'è una piccola cosa da menzionare. Per impostazione predefinita, PDO si limita a emulazione istruzioni preparate.
E mentre è in modalità di emulazione, esegue la stessa vecchia query senza effettivamente preparare una singola istruzione :)
Quindi, prima di tutto,
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
per attivare le vere dichiarazioni preparate.
C'è un'altra piccola cosa da menzionare.
Purtroppo, ci sono pochissime reali conoscenza nel mondo. E soprattutto nel mondo dei siti di domande e risposte. Le persone tendono a ripetere le informazioni che hanno letto e che hanno ritenuto ragionevoli. Senza eseguire alcun test a prova o addirittura senza metterci le mani sopra. Quindi, "spesso annotato" non dovrebbe essere considerato una fonte affidabile.
Torniamo alla questione:anche se dovrebbe esserci qualche penalità, dovrebbe essere insignificante per la maggior parte delle volte. Se lo è, devi mettere a punto il tuo sistema.
Ad ogni modo, nella modalità di emulazione l'hai ottenuto sia "veloce" che sicuro.
Aggiorna
Beh, dopo aver eseguito i test sui miei dati, devo dire che c'è qualcosa che non va nel tuo database se hai una differenza di 3 volte su un set di dati di grandi dimensioni.
Per una domanda lampo
select title from Board where id = 1
i risultati sono
emulation on off
query 0.07 0.130
prepare 0.075 0.145
mentre per la query piuttosto onerosa
select title from Board where id > 1
i risultati sono
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Quindi, come possiamo vedere, su un set di dati di grandi dimensioni la differenza diventa impercettibile.
Per la query lampo c'è una certa differenza, ma, poiché richiede solo 0,0003° fazione di secondo (per una singola query), direi che è un esempio perfetto per la parola "indifferenza".
Per ottenere risultati uguali tra query()/prepare() - ho solo un'idea:PDO usa prepare/execute per tutte le query, anche quelle senza binding.
Ora il problema della codifica.
Sì, lo strano problema GBK influisce su PDO per le versioni precedenti alla 5.3.3. Queste versioni non avevano modo di impostare la codifica corretta ed erano inevitabilmente vulnerabili (in modalità di emulazione). Ma dal momento che 5.3.3 PDO supporta l'impostazione della codifica in DSN, e ora va tutto bene con esso.
Per mysqli uno deve usare mysqli_set_charset()
proprio per questo con lo stesso risultato (impenetrabile).
Nella mia classe che si basa su mysqli, sto usando la mia implementazione segnaposto e non uso affatto istruzioni preparate. Non per motivi di prestazioni, ma per una migliore affidabilità.