PDO nabízí pěkné rozhraní, ale větší generičnost také znamená více problémů při řešení jemných idiosynkrasí každého backendu. Pokud se podíváte na bugtracker, má řadu otevřených problémů a některé z nich jsou vážné.
Zde je neoficiální důkaz s postgresql:Parser PDO má potíže se standard_conforming_strings nastavenými na ON (což je nyní výchozí, od PG-9.1). Testovací případ s php-5.3.9:
$dbh->exec("SET standard_conforming_strings=on");
$p=$dbh->prepare("SELECT 1 WHERE 'ab\' = :foo AND 'cd' = :bar");
$p->execute(array(":foo" => "ab", ":bar" => "cd"));
Funkce execute() neočekávaně selže na vrstvě PDO sDatabase error: SQLSTATE[HY093]: Invalid parameter number: :foo
. Zdá se, že není schopen identifikovat :foo jako parametr.
Pokud se dotaz zastaví po 'ab\'=:foo
, bez další podmínky pak funguje dobře. Nebo pokud druhá podmínka neobsahuje řetězec, funguje také dobře.
Problém vypadá podobně jako problém #55335 , který byl zamítnut jako Není chyba , podle mého názoru docela špatně.[Vlastně jsem sám hacknul PDO, abych to opravil, ale způsobem, který je nekompatibilní s jinými backendy, takže žádný patch. Byl jsem vyveden z míry tím, že dotazovací lexikální analyzátor je tak obecný.]
Na druhou stranu, protože pg_* je blíže libpq, tento druh problému je v první řadě méně pravděpodobný, a pokud ano, snáze se řeší.
Chtěl bych tedy říci, že s PDO není vše hezké. Interně je to určitě náročnější než pg_* a větší složitost znamená více chyb. Jsou tyto chyby vyřešeny? Na základě určitých záznamů bugtracker, ne nutně.