2012-01-02 14 views
35

Quiero seleccionar una base de datos MySQL para usar después de que ya se haya creado un objeto PHP PDO. ¿Cómo hago esto?¿Cómo selecciono una base de datos MySQL para usar con PDO en 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'); 

¿Hay una PDO equivalente a mysqli :: select_db?

Quizás estoy tratando de usar PDO incorrectamente? Por favor ayuda o explica

EDITAR

¿No debería estar utilizando DOP para crear nuevas bases de datos? Entiendo que la mayoría de los beneficios del uso de PDO se pierden en una operación poco utilizada que no inserta datos como CREATE DATABASE, pero parece extraño tener que usar una conexión diferente para crear la base de datos y luego crear una conexión PDO para hacer otras llamadas .

+0

muestran algo de código ... – Jakub

+0

Es probable que necesite para crear un nuevo objeto PDO para conectarse a otra base de datos. – Ignas

+2

Puede usar 'select table.field from database.table', suponiendo que cualquier ID de usuario con la que se haya conectado tenga los derechos apropiados en las otras tablas db /. –

Respuesta

44

Normalmente se especificaría la base de datos en el DSN cuando se conecta. Pero si está creando una nueva base de datos, obviamente no puede especificar esa base de datos antes de crearla.

Puede cambiar su base de datos por defecto con la declaración USE:

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

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

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

posteriores CREATE TABLE declaraciones serán creados en su NewDatabase.


comentario Re partir @ 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.

que acabo de hacer algunas pruebas y no veo que eso ocurra. Cambiar la base de datos solo ocurre en el servidor, y no cambia nada en la configuración de PDO en el cliente. Aquí hay un ejemplo:

<?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)); 

Si lo que dice es cierto, entonces esto debería funcionar sin error. PDO puede usar un parámetro nombrado dado más de una vez solo si PDO :: ATTR_EMULATE_PREPARES es verdadero. Entonces, si está diciendo que este atributo se establece en verdadero como un efecto secundario de cambiar las bases de datos, entonces debería funcionar.

Pero no funciona, recibe un error "Número de parámetro inválido" que indica que las instrucciones preparadas no emuladas siguen vigentes.

+2

¿De verdad? ¿consulta? Estoy bastante seguro de que estás buscando el exec –

+3

@TomvanderWoerdt: Probé tanto query() como exec() y ambos funcionan. query() devuelve un objeto PDOStatement, y exec() devuelve el número de filas afectadas (1 para la creación, 0 para el uso). Para estas declaraciones, los valores de retorno son casi irrelevantes. –

+2

El punto es que es fácil cambiar la base de datos predeterminada en un manejador de db abierto; no hay necesidad de abrir una segunda conexión db. –

0

Debe establecer la base de datos cuando crea el objeto PDO. Un ejemplo (de 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

Por lo que yo sé, usted tiene que crear un nuevo objeto para cada conexión. Siempre puede extender la clase PDO con un método que se conecta a múltiples bases de datos. Y luego usarlo como quiera:

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 
} 

y utilizarlo como $yourclass->pickDatabase('main')->fetchAll('your stuff');

+0

¿Por qué tiene que configurarlo al crear el objeto en PDO pero no en MySQLi? –

+0

Bueno, no puedo responder eso, ya que es como lo hicieron los chicos de PHP :) – Ignas

1

obsesivamente puede seleccionar una base de datos MySQL para usar después de un objeto PHP DOP ya se ha creado como bramido mi código

LA DECLARACIÓN DE USO ..Pero aquí remeber Uso Declaración de comandos de MySQL es

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; 

espero que mi código es útil para solicitada

Cuestiones relacionadas