Когда я подключаюсь к базе данных 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)?
Как человек, который реализовал оба варианта, могу сказать вам, что причина заключается в том, что, передавая строку через as-to postgres (и ODBC), код драйвера PDO для этих баз данных не нуждается в обновлении, поскольку базовая библиотека добавляет новые функции ,
Так как MySQL не имеет собственного кода синтаксического анализа строки, мы изобрели механизм передачи данных в базовые вызовы функций MySQL, которые имеют очень специфический API с фиксированными параметрами.
Не случайно; это очень преднамеренно.
Да, это несоответствие API является серьезным раздражением.
В процессе работы я собираю фактическую строку DSN с необязательным именем пользователя и паролем с использованием синтаксиса строки запроса – затем анализируйте и создайте так:
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
Вид хромой, но он прост и работает.
Это просто случайность, что человек, который реализовал соединитель mysql, сделал это иначе, чем тот, кто реализовал разъем pgsql.