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.
pokazać jakiś kod ... – Jakub
Prawdopodobnie będzie musiał utworzyć nowy obiekt PDO połączyć się z innej bazy danych. – Ignas
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. –