【问题标题】:How to get database name in PDO?如何在 PDO 中获取数据库名称?
【发布时间】:2012-03-08 12:02:28
【问题描述】:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

PDO 中是​​否有存储数据库名称(testdb 值)的函数或常量?我在 $dbh 上做了一个 var_dump 却找不到任何东西...

【问题讨论】:

    标签: php database pdo


    【解决方案1】:

    不,没有内置功能。

    但是你可以扩展class MyPdo extends PDO,解析和存储dsn,然后通过一些访问器返回

    class MyPdo extends PDO
    {
        ...
    
        /**
         * @param string $dsnParameter
         * @param string|null $default
         * @throws RuntimeException
         * @return string|null
         */
        public function getDsnValue($dsnParameter, $default = NULL)
        {
            $pattern = sprintf('~%s=([^;]*)(?:;|$)~', preg_quote($dsnParameter, '~'));
    
            $result = preg_match($pattern, $this->dsn, $matches);
            if ($result === FALSE) {
                throw new RuntimeException('Regular expression matching failed unexpectedly.');
            }
    
            return $result ? $matches[1] : $default;
        }
    
        ...
    

    【讨论】:

    • 我绝对不建议解析,如果他扩展,他应该添加一个他可以引用的数据库名称的成员。
    • 刚刚添加了一些代码。并不是说它经过了完全广泛的测试,我几周前已经写了这个并且使用了,只是再次寻找这个问题,因为它没有给我带来问题,所以在这里发布它作为一个例子。它不是根据任何规范编写的,但到目前为止确实有效,尤其是。用于从 DSN 获取数据库名称。
    【解决方案2】:

    如果您使用的是 mysql,您可以通过 select database() 获取默认数据库的名称。

    /* @var $pdo PDO */
    $pdo->query('select database()')->fetchColumn();
    

    【讨论】:

    • 通常我不会使用它,但在某些无法扩展 PDO 代码的情况下,它会起作用。
    【解决方案3】:

    您可以在最初设置数据库名称时使用setAttribute()(本质上是键值对)方法来存储数据库名称,然后稍后在您的代码中使用getAttribute() 来查看值是什么。

    http://www.php.net/manual/en/pdo.setattribute.php

    【讨论】:

    • 这不能按预期工作,因为 PDO::setAttribute 只接受整数作为键。定义自己的常数可以做到,但这有点棘手。看这里:http://php.net/manual/en/pdo.setattribute.php
    • 什么是错误的猜测答案... - PHP 还具有可以在运行时设置的动态公共属性 - 不需要 setAttribute()getAttribute(),只需执行 $pdo->myDataBaseNameProperty = 'dbame'; 就足够了。
    • 3 年后,我的(接受的)答案没有经受住时间的考验。我推荐下面有一个明显更好的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 2011-06-04
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多