Zazwyczaj podczas łączenia określasz bazę danych w DSN. Ale jeśli tworzysz nową bazę danych, oczywiście nie możesz określić DSN tej bazy danych przed jej utworzeniem.
Możesz zmienić domyślną bazę danych za pomocą USE
oświadczenie:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Kolejne CREATE TABLE
wyciągi zostaną utworzone w nowej bazie danych.
Ponownie komentarz od @Mike:
Właśnie zrobiłem kilka testów i nie widzę, żeby tak się działo. Zmiana bazy danych odbywa się tylko na serwerze i nie zmienia nic 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ą, to powinno działać bezbłędnie. PDO może użyć danego nazwanego parametru więcej niż jeden raz tylko wtedy, gdy PDO::ATTR_EMULATE_PREPARES ma wartość true. Więc jeśli mówisz, że ten atrybut jest ustawiony na true jako efekt uboczny zmiany baz danych, to powinno działać.
Ale to nie działa — pojawia się błąd „Nieprawidłowy numer parametru”, który wskazuje, że nieemulowane przygotowane instrukcje pozostają w mocy.