Por que é PHP DOP DSN um formato diferente para MySQL contra PostgreSQL?

votos
30

Quando eu conectar a um banco de dados MySQL usando DOP, a maneira que eu preciso para se conectar é:

$pdoConnection = new PDO(mysql:host=hostname;dbname=databasename,user,password);

Mas, para o PostgreSQL, o DSN é mais normal (IMO):

$pdoConnection = new PDO(pgsql:host=hostname;dbname=databasename;user=username;password=thepassword);

Existe alguma razão para que o MySQL não pode usar uma única corda? Ou isso é apenas por causa das versões que estou usando (PHP 5.2, MySQL 5.0, PostgreSQL 8.1)?

Publicado 26/10/2008 em 02:52
fonte usuário
Em outras línguas...                            


4 respostas

votos
-15

É apenas um acidente que a pessoa que implementou o conector mysql fez isso de forma diferente do que a pessoa que implementou o conector pgsql.

Respondeu 26/10/2008 em 02:56
fonte usuário

votos
84

Como a pessoa que implementou ambos, posso dizer-lhe que a razão é que ao fazer passar a corda através como está a postgres (e ODBC) o código do driver PDO para esses bancos de dados não precisam ser atualizados como a biblioteca subjacente adiciona novos recursos .

Desde o MySQL não tem o seu próprio código de análise seqüência de conexão, nós inventamos um mecanismo para passar dados para os subjacentes chamadas de função do MySQL, que têm uma API muito específica com parâmetros fixos.

Nenhum acidente; é muito deliberada.

Respondeu 22/08/2009 em 01:28
fonte usuário

votos
2

Sim, esta inconsistência API é um grande incómodo.

Como uma solução alternativa, eu arrumar a corda DSN real com um nome de usuário e senha opcional usando a sintaxe de query-string - em seguida, analisar e construir assim:

parse_str($connection_string, $params);

$pdo = new PDO($params['dsn'], @$params['username'], @$params['password']);

Assim, para PostgreSQL, use um $connection_stringcomo:

dsn=pgsql:host=localhost;dbname=test;user=root;password=root

E para MySQL, use uma string como:

dsn=mysql:host=localhost;dbname=testdb&username=root&password=root

Tipo de coxo, mas é simples e funciona.

Respondeu 25/05/2016 em 11:52
fonte usuário

votos
0

Esta questão é mais de 10 anos, mas eu ainda acabar aqui cada vez que criar um novo projeto que usa DOP ... Eu estou escrevendo a minha solução aqui para que eu possa me salvar o problema próxima vez: P

class MyPDO extends PDO {
    public function __construct($dsn, $options = null) {
        $user=null;
        $pass=null;

        if (preg_match("/user=([^;]*)/", $dsn, $matches)) {
            $user=$matches[1];
        }
        if (preg_match("/password=([^;]*)/", $dsn, $matches)) {
            $pass=$matches[1];
        }

        parent::__construct($dsn, $user, $pass, $options);
    }
}
Respondeu 25/11/2019 em 20:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more