2012-01-02 10 views
35

Chcę wybrać bazę danych MySQL do użycia po utworzeniu obiektu PHP PDO. Jak mam to zrobic?Jak wybrać bazę danych MySQL do użycia z PDO w 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'); 

Czy istnieje odpowiednik PDO dla mysqli :: select_db?

Być może próbuję nieprawidłowo korzystać z PDO? Proszę pomóż lub wyjaśnij.

EDIT

nie miałbym używać PDO do tworzenia nowych baz danych? Rozumiem, że większość korzyści wynikających z używania PDO jest tracona w przypadku rzadko używanych operacji, które nie zawierają danych takich jak CREATE DATABASE, ale wydaje się dziwne, aby użyć innego połączenia do utworzenia bazy danych, a następnie utworzyć połączenie PDO, aby wykonywać inne połączenia .

+0

pokazać jakiś kod ... – Jakub

+0

Prawdopodobnie będzie musiał utworzyć nowy obiekt PDO połączyć się z innej bazy danych. – Ignas

+2

Możesz użyć 'select table.field from database.table', zakładając, że jakikolwiek identyfikator użytkownika, z którym się łączysz, ma odpowiednie prawa w innych bazach danych/tabelach. –

Odpowiedz

44

Zazwyczaj należy określić bazę danych DSN po podłączeniu. Ale jeśli tworzysz nową bazę danych, oczywiście nie możesz określić tej bazy danych DSN przed jej utworzeniem.

Można zmienić domyślną bazę danych z rachunku USE:

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

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

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

Kolejne CREATE TABLE sprawozdanie zostanie utworzony w newdatabase.


Re komentarz od @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.

Właśnie zrobiłem kilka testów i nie widzę, że dzieje. Zmiana bazy danych ma miejsce tylko na serwerze i nie zmienia niczego w konfiguracji PDO w kliencie. Oto przykład:

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

Jeśli to, co mówisz, jest prawdą, powinno to działać bezbłędnie. PDO może używać podanego parametru tylko raz, jeśli PDO :: ATTR_EMULATE_PREPARES ma wartość true. Więc jeśli mówisz, że ten atrybut jest ustawiony jako prawdziwy jako efekt uboczny zmiany baz danych, to powinien działać.

Ale to nie działa - pojawia się błąd "Nieprawidłowy numer parametru", który wskazuje, że nieślubione przygotowane instrukcje pozostają w mocy.

+2

Naprawdę? pytanie? Jestem prawie pewien, że szukasz exec –

+3

@TomvanderWoerdt: Przetestowałem oba zapytania() i exec() i oba działają. query() zwraca obiekt PDOStatement, a exec() zwraca liczbę uszkodzonych wierszy (1 dla utworzenia, 0 dla użycia). W przypadku tych instrukcji wartości zwracane są prawie nieistotne. –

+2

Chodzi o to, że łatwo jest zmienić domyślną bazę danych na otwartej klamce db; nie trzeba otwierać drugiego połączenia db. –

0

Powinieneś ustawić bazę danych podczas tworzenia obiektu PDO. Przykład (z 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

O ile mi wiadomo, trzeba utworzyć nowy obiekt dla każdego połączenia. Zawsze można rozszerzyć klasę PDO za pomocą metody, która łączy się z wieloma bazami danych. A następnie używać go jak chcesz:

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 
} 

i używać go jak $yourclass->pickDatabase('main')->fetchAll('your stuff');

+0

Dlaczego musisz ustawić go podczas tworzenia obiektu w PDO, ale nie w MySQLi? –

+0

Cóż, nie mogę odpowiedzieć na to pytanie, bo tak zrobili faceci PHP :) – Ignas

1

Obsessionally można wybrać bazy danych MySQL do użycia po obiekcie PHP PDO został już utworzony jak poniżej mojego kodu

z użytkowania Oświadczenie ..Pamiętaj jednak tutaj KORZYSTAĆ stwierdzenie jest polecenie 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; 

Mam nadzieję, że mój kod jest pomocne dla zwróciła

Powiązane problemy