35

当我使用 PDO 连接到 MySQL 数据库时,我需要连接的方式是:

$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)?

4

4 回答 4

96

作为实现这两者的人,我可以告诉你,原因是通过将字符串按原样传递给 postgres(和 ODBC),这些数据库的 PDO 驱动程序代码不需要更新,因为底层库添加了新功能.

由于 MySQL 没有自己的连接字符串解析代码,我们发明了一种将数据传递到底层 MySQL 函数调用的机制,这些函数调用具有非常特定的 API 和固定参数。

没有意外;这是非常刻意的。

于 2009-08-22T00:28:06.630 回答
7

这已在 PHP 7.4 中得到解决,如新特性中所示。

我已经在本地确认我们可以写:

$dbh = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8mb4;user=root;password=')
于 2020-06-26T04:05:59.727 回答
3

是的,这种 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

有点蹩脚,但它很简单并且有效。

于 2016-05-25T11:52:48.317 回答
0

这个问题已经有 10 多年的历史了,但是每次我创建一个使用 PDO 的新项目时,我仍然会在这里结束......我在这里写我的解决方案,以便下次我可以省去自己的麻烦:P

class MyPDO extends PDO {
    public function __construct($dsn, $options = null) {
        $user=null;
        $pass=null;

        if (preg_match("/user=([^;]*)/", $dsn, $matches)) {
            $user=$matches[1];
        }
        if (preg_match("/password=([^;]*)/", $dsn, $matches)) {
            $pass=$matches[1];
        }

        parent::__construct($dsn, $user, $pass, $options);
    }
}
于 2019-11-25T17:19:56.280 回答