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

Esiste una funzione o una costante all'interno di PDO che memorizza il nome del database (il valore testdb)? Ho fatto un var_dump su $ dbh e non riesco a trovare nulla ...Come ottenere il nome del database in PDO?

risposta

-7

È possibile utilizzare il setAttribute() (essenzialmente una coppia chiave-valore) metodo per memorizzare il nome del database quando lo si imposta inizialmente, quindi utilizzare il getAttribute() più avanti nel codice per vedere qual è il valore.

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

+2

Questo non funziona come previsto poiché PDO :: setAttribute accetta solo un numero intero come chiave. Definire la tua costante potrebbe farlo, ma è un po 'complicato. guarda qui: 'http: // php.net/manual/it/pdo.setattribute.php' – tomvo

+4

Che risposta sbagliata indovina ... - PHP ha anche proprietà pubbliche dinamiche che puoi impostare in fase di esecuzione - non c'è bisogno di' setAttribute () 'o' getAttribute() ', facendo semplicemente à la' $ pdo-> myDataBaseNameProperty = 'dbame'; 'sarebbe sufficiente. – hakre

+2

3 anni dopo, e la mia risposta (accettata) non ha superato la prova del tempo. C'è una risposta chiaramente migliore sotto che raccomanderei. –

13

No, non c'è una funzione integrata.

Ma è possibile estendere class MyPdo extends PDO, analizzare e memorizzare DSN e restituirlo da parte di alcuni di accesso

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

Non consiglio assolutamente l'analisi, se si estende, dovrebbe aggiungere un membro per il nome del database a cui potrebbe fare riferimento. –

+0

@Mike Purcell: "dipende" – zerkms

+1

Appena aggiunto un po 'di codice. Non che sia stato completamente testato, l'ho scritto alcune settimane fa e lo usa, ho appena visto di nuovo il problema e non mi ha messo nei problemi, pubblicandolo qui come esempio. Non è scritto dopo alcuna specifica, ma funziona fino ad ora, esp. per ottenere il nome del database da DSN. – hakre

28

Dato che sei su MySQL, si può fare select database() per ottenere il nome del database predefinito.

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

Normalmente non avrei usato questo, ma in alcune situazioni in cui non è possibile estendere il codice PDO, questo funzionerà. –

Problemi correlati