2012-02-17 5 views
19
$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)? Я сделал var_dump на $ dbh и не нашел ничего ...Как получить имя базы данных в PDO?

ответ

-7

Вы можете использовать setAttribute() (по существу пару ключей значения) метод, чтобы сохранить имя базы данных, когда вы установите его сначала, затем используйте код getAttribute() в своем коде, чтобы узнать, что это за значение.

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

+2

Это не работает должным образом, поскольку PDO :: setAttribute принимает только целое число как ключ. Определение собственной константы могло бы сделать это, но это немного сложно. смотрите здесь: 'http: // php.net/manual/en/pdo.setattribute.php' – tomvo

+4

Какой неправильный угаданный ответ ... - PHP также имеет динамические общедоступные свойства, которые вы можете установить во время выполнения - нет необходимости в setAttribute () 'или' getAttribute() ', просто выполнив à la' $ pdo-> myDataBaseNameProperty = 'dbame'; 'будет достаточно. – hakre

+2

3 года спустя, и мой (принятый) ответ не выдержал проверку временем. Ниже приведен явный лучший ответ, который я бы рекомендовал. –

13

Нет, нет встроенной функции.

Но вы можете расширить 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; 
    } 

    ... 
+1

Я бы определенно не рекомендовал разбор, если он расширяет, он должен добавить член для имени базы данных, к которому он мог обратиться. –

+0

@Mike Purcell: «все зависит» – zerkms

+1

Просто добавил код. Не то, чтобы это было полностью проверено, я написал это несколько недель назад и использовал, просто снова искал проблему и не вызывал у меня проблем, размещая ее в качестве примера здесь. Он не написан после каких-либо спецификаций, но работает до сих пор, особенно. для получения имени базы данных из DSN. – hakre

28

Учитывая вы на MySQL, вы можете сделать select database(), чтобы получить имя базы данных по умолчанию.

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

Обычно я бы не использовал это, но в определенных ситуациях, когда вы не можете расширять код PDO, это будет работать. –

Смежные вопросы