2012-01-02 4 views
35

Desidero selezionare un database MySQL da utilizzare dopo che un oggetto PDO PHP è già stato creato. Come faccio a fare questo?Come selezionare un database MySQL da utilizzare con PDO in PHP?

// create PDO object and connect to MySQL 
$dbh = new PDO('mysql:host=localhost;', 'name', 'pass'); 

// create a database named 'database_name' 

// select the database we just created (this does not work) 
$dbh->select_db('database_name'); 

Esiste un PDO equivalente a mysqli :: select_db?

Forse sto cercando di utilizzare PDO in modo errato? Si prega di aiutare o spiegare.

EDIT

Dovrei non utilizzerò DOP per creare nuovi database? Comprendo che la maggior parte dei vantaggi dell'utilizzo di PDO si perde in un'operazione raramente utilizzata che non inserisce dati come CREATE DATABASE, ma sembra strano dover utilizzare una connessione diversa per creare il database, quindi creare una connessione PDO per effettuare altre chiamate .

+0

mostrare un po 'di codice ... – Jakub

+0

Si avrà probabilmente bisogno di creare un nuovo oggetto PDO per la connessione a un altro database. – Ignas

+2

Puoi usare 'selezionare table.field da database.table', assumendo che qualsiasi ID utente con cui ti sei connesso abbia i diritti appropriati sugli altri db/tabelle. –

risposta

44

In genere si dovrebbe specificare il database nel DSN quando ci si connette. Ma se stai creando un nuovo database, ovviamente non puoi specificare quel database come il DSN prima di crearlo.

È possibile modificare il database di default con l'affermazione USE: saranno creati

$dbh = new PDO("mysql:host=...;dbname=mysql", ...); 

$dbh->query("create database newdatabase"); 

$dbh->query("use newdatabase"); 

successivi CREATE TABLE dichiarazioni nel vostro newdatabase.


Re commento da @ Mike:

When you switch databases like that it appears to force PDO to emulate prepared statements. Setting PDO::ATTR_EMULATE_PREPARES to false and then trying to use another database will fail.

Ho appena fatto alcuni test e non vedo che questo accada. La modifica del database avviene solo sul server e non modifica nulla sulla configurazione di PDO nel client. Ecco un esempio:

<?php 

// connect to database 
try { 
    $pdo = new PDO('mysql:host=huey;dbname=test', 'root', 'root'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
} catch(PDOException $err) { 
    die($err->getMessage()); 
} 

$stmt = $pdo->prepare("select * from foo WHERE i = :i"); 
$result = $stmt->execute(array("i"=>123)); 
print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); 

$pdo->exec("use test2"); 

$stmt = $pdo->prepare("select * from foo2 WHERE i = :i AND i = :i"); 
$result = $stmt->execute(array("i"=>456)); 
print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); 

Se quello che stai dicendo è vero, allora questo dovrebbe funzionare senza errori. PDO può utilizzare un determinato parametro denominato più di una volta solo se PDO :: ATTR_EMULATE_PREPARES è true. Quindi se stai dicendo che questo attributo è impostato su true come effetto collaterale della modifica dei database, allora dovrebbe funzionare.

Ma non funziona: riceve un errore "Numero di parametro non valido" che indica che le istruzioni preparate non emulate rimangono attive.

+2

Davvero? interrogare? Sono abbastanza sicuro che stai cercando exec –

+3

@TomvanderWoerdt: Ho testato sia query() che exec() e funzionano entrambi. query() restituisce un oggetto PDOStatement ed exec() restituisce il numero di righe interessate (1 per la creazione, 0 per l'uso). Per queste affermazioni, i valori di ritorno sono quasi irrilevanti. –

+2

Il punto è che è facile cambiare il database predefinito su un handle db aperto; non è necessario aprire una seconda connessione db. –

0

È necessario impostare il database quando si crea l'oggetto PDO. Un esempio (da here)

<?php 
$hostname = "localhost"; 
$username = "your_username"; 
$password = "your_password"; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password); 
    echo "Connected to database"; // check for connection 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
?> 
-1

Per quanto ne so, è necessario creare un nuovo oggetto per ogni connessione. È sempre possibile estendere la classe PDO con un metodo che si connette a più database. E quindi utilizzarlo come volete:

public function pickDatabase($db) { 
    if($db == 'main') { 
    return $this->db['main']; //instance of PDO object 
    else 
    return $this->db['secondary']; //another instance of PDO object 
} 

e utilizzarlo come $yourclass->pickDatabase('main')->fetchAll('your stuff');

+0

Perché devi impostarlo quando si crea l'oggetto in PDO ma non in MySQLi? –

+0

Beh, non posso rispondere come è successo ai ragazzi di PHP :) – Ignas

1

ossessivamente è possibile selezionare un database MySQL da utilizzare dopo che un oggetto PHP DOP è già stato creato come muggito il mio codice

con USO DICHIARAZIONE ..Ma ricordate qui USO affermazione è il comando mysql

try { 

$conn = new PDO("mysql:host=$servername;", $username, $password); 
// set the PDO error mode to exception 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$conn->exec("use databasename"); 
//application logic 
//....... 
//application logic 
} 

catch(PDOException $e) 
{ 
     echo $sql . "<br>" . $e->getMessage(); 
} 

$conn = null; 

Spero che il mio codice è utile per la richiesta