Подтвердить что ты не робот

Почему PHP PDO DSN отличается от MySQL для PostgreSQL?

Когда я подключаюсь к базе данных 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)?

4b9b3361

Ответ 1

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

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

Не случайно; это очень преднамеренное.

Ответ 2

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

Как работа, я собираю фактическую строку DSN с дополнительным именем пользователя и паролем, используя синтаксис строки запроса - затем анализируйте и создайте так:

parse_str($connection_string, $params);

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

Итак, для PostgreSQL используйте $connection_string like:

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

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

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

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

Ответ 3

Просто случайно, что человек, который реализовал соединитель mysql, сделал это иначе, чем тот, кто реализовал коннектор pgsql.