2012-02-17 10 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(); 
} 

¿Hay una función o constante dentro de PDO que almacena el nombre de la base de datos (el valor testdb)? Hice un var_dump en $ dbh y no puedo encontrar nada ...¿Cómo obtener el nombre de la base de datos en PDO?

Respuesta

-7

se puede utilizar el método de setAttribute() (esencialmente un valor de par de claves) para almacenar el nombre de base de datos cuando lo creó inicialmente, luego use el getAttribute() más adelante en su código para ver cuál es el valor.

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

+2

Esto no funciona como se esperaba, ya que PDO :: setAttribute solo acepta un número entero como clave. Definir tu propia constante podría hacerlo, pero es un poco complicado. mira aquí: 'http: // php.net/manual/es/pdo.setattribute.php' – tomvo

+4

Qué respuesta adivinada incorrecta ... - PHP también tiene propiedades públicas dinámicas que puedes establecer en tiempo de ejecución - no hay necesidad de' setAttribute () 'o' getAttribute() ', simplemente haciendo à la' $ pdo-> myDataBaseNameProperty = 'dbame'; 'sería suficiente. – hakre

+2

3 años después, y mi respuesta (aceptada) no ha resistido la prueba del tiempo. Hay una respuesta claramente mejor a continuación que recomendaría. –

13

No, no hay función incorporada.

Pero se puede extender class MyPdo extends PDO, analizar y almacenar DSN y devolverlo por algún descriptor de acceso

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

Definitivamente no recomendaría el análisis sintáctico, si se extiende, debería agregar un miembro para el nombre de la base de datos que podría consultar. –

+0

@Mike Purcell: "depende" – zerkms

+1

Acabo de agregar un código. No es que haya sido probado exhaustivamente, lo escribí hace algunas semanas y lo uso, simplemente volví a mirar el problema y como no me causó problemas, lo publiqué como un ejemplo aquí. No está escrito después de ninguna especificación, pero funciona hasta ahora, esp. para obtener el nombre de la base de datos de DSN. – hakre

28

Teniendo en cuenta que estás en MySQL, que puede hacer select database() para obtener el nombre de la base de datos predeterminada.

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

Normalmente no lo hubiera usado, pero en ciertas situaciones donde no se puede extender el código PDO, esto funcionará. –

Cuestiones relacionadas