sql >> Databáze >  >> RDS >> PostgreSQL

Funkce PDO vs pg_*

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ě.



  1. Uzavření připojení JDBC ve fondu

  2. Jak vytvořím cizí klíč v SQL Server?

  3. Jak importovat soubor .bak SQL Serveru do MySQL?

  4. Co je nového v MariaDB Cluster 10.4