Почему 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)?
Ответы
Ответ 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.