PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Funções PDO vs pg_*


O PDO oferece uma interface agradável, mas mais genericidade também significa mais problemas para lidar com idiossincrasias sutis de cada backend. Se você olhar para o bugtracker, ele tem vários problemas em aberto, e alguns deles são sérios.

Aqui está uma evidência anedótica com o postgresql:O analisador do PDO tem problemas com standard_conforming_strings definido como ON (que agora é o padrão, a partir do PG-9.1). Caso de teste com 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"));

O execute() falha inesperadamente na camada PDO com Database error: SQLSTATE[HY093]: Invalid parameter number: :foo . Parece que não consegue identificar :foo como parâmetro.

Se a consulta parar após 'ab\'=:foo , sem outra condição, funcionará bem. Ou se a outra condição não incluir uma string, funcionará bem também.

O problema é semelhante ao número 55335 , que foi descartado como Não é um bug , erroneamente na minha opinião.[Na verdade, eu mesmo hackeei o PDO para consertá-lo, mas de uma forma que é incompatível com outros backends, então sem patch. Fiquei desconcertado com o analisador léxico de consulta sendo tão genérico.]

Por outro lado, sendo pg_* mais próximo de libpq, esse tipo de problema é menos provável de acontecer em primeiro lugar, e mais fácil de resolver se acontecer.

Então, meu ponto seria que nem tudo é bom com PDO. Internamente, é certamente mais desafiador do que pg_*, e mais complexidade significa mais bugs. Esses bugs são corrigidos? Com base em certas entradas do rastreador de bugs, não necessariamente.