2012-02-17 2 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の値)を格納する関数または定数がありますか?私は$ dbhでvar_dumpを実行し、何も見つけられませんでした。PDOでデータベース名を取得するには?

答えて

-7

あなたはあなたがそれを設定するときに、データベース名を格納するsetAttribute()(基本的にキーと値のペア)メソッドを使用することができ、class MyPdo extends PDOを拡張解析し、DSN保存し、いくつかのアクセサでそれを返すことができます最初にコード内の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() 'のように、' $ pdo-> myDataBaseNameProperty = 'dbame';を実行するだけで十分です。 – hakre

+2

3年後、私の(受け入れられた)答えは時間のテストを立てていませんでした。私が推薦するよりはっきりと優れた答えがあります。 –

13

いいえ、組み込み機能はありません。

しかし、あなたは

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コードを拡張できない特定の状況では、これが機能します。 –

関連する問題