2008-10-26 10 views
29

Cuando conecto a una base de datos MySQL con DOP, la forma en que se necesita para conectarse es:¿Por qué PHP DSP DSN es un formato diferente para MySQL versus PostgreSQL?

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

Pero, para PostgreSQL, el DSN es más estándar (OMI):

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

¿Hay ¿Por qué MySQL no puede usar una sola cadena? ¿O es solo por las versiones que estoy usando (PHP 5.2, MySQL 5.0, PostgreSQL 8.1)?

Respuesta

-15

Es sólo un accidente que la persona que implementa el conector de MySQL lo hizo de manera diferente a la persona que implementa el conector pgsql.

83

Como la persona que implementó ambos, puedo decirle que la razón es que al pasar la cadena a través de as-is a postgres (y ODBC) el código de controlador PDO para esas bases de datos no necesita actualizarse como subyacente la biblioteca agrega nuevas características.

Dado que MySQL no tiene su propio código de análisis de cadenas de conexión, inventamos un mecanismo para pasar datos a las llamadas de funciones subyacentes de MySQL, que tienen una API muy específica con parámetros fijos.

No fue casual; es muy deliberado

+16

No se puede discutir con la respuesta de Wez ... ¿cómo no se ha aceptado esto todavía? :) – TML

+1

¡Gracias por la respuesta detallada! –

+2

No lo entiendo Si tuviera que analizar la cadena para MySQL de todos modos, ¿por qué no analizar el nombre de usuario y la contraseña del DSN? Ahora tenemos que usar varios campos en lugar de solo una cadena de conexión; o analizar y eliminar el nombre de usuario/contraseña de un DSN mysql semi-válido; o invente un nuevo formato de cadena de conexión que funcione para ambos. Cualquiera de estas soluciones es fácil de implementar, pero debe implementarse en el territorio del usuario para cada biblioteca que use PDO. Ugh. –

2

Sí, esta inconsistencia API es una molestia importante.

Como solución alternativa, I paquete de la cadena DSN real con un nombre de usuario y una contraseña opcional usando la sintaxis de cadena de consulta - a continuación, analizar y construir de esta manera:

parse_str($connection_string, $params); 

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

Así que para PostgreSQL, utilice una $connection_string como:

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

Y para MySQL, utilice una cadena como:

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

Tipo de cojo, pero es simple y funciona.

Cuestiones relacionadas