Почему PHP PDO DSN отличается от MySQL по сравнению с PostgreSQL? - PullRequest
32 голосов
/ 26 октября 2008

Когда я подключаюсь к базе данных MySQL с помощью PDO, мне нужно подключиться следующим образом:

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

Но для PostgreSQL DSN является более стандартным (IMO):

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

Есть ли причина, по которой MySQL не может использовать одну строку? Или это только из-за версий, которые я использую (PHP 5.2, MySQL 5.0, PostgreSQL 8.1)?

Ответы [ 2 ]

87 голосов
/ 22 августа 2009

Как человек, который реализовал и то, и другое, я могу сказать вам, что причина в том, что, передавая строку как есть в postgres (и ODBC), код драйвера PDO для этих баз данных не нужно обновлять как базовую библиотеку. добавляет новые функции.

Поскольку MySQL не имеет своего собственного кода синтаксического анализа строки соединения, мы изобрели механизм для передачи данных в базовые вызовы функций MySQL, которые имеют очень специфический API с фиксированными параметрами.

Не случайно; это очень умышленно.

2 голосов
/ 25 мая 2016

Да, это несоответствие API вызывает большое раздражение.

В качестве обходного пути я упаковываю фактическую строку уведомления о доставке с необязательным именем пользователя и паролем, используя синтаксис строки запроса, а затем анализирую и создаю так:

parse_str($connection_string, $params);

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

Так что для PostgreSQL используйте $connection_string, например:

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

А для MySQL используйте строку вроде:

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

Вид хромает, но все просто и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...