Obvykle byste při připojování specifikovali databázi v DSN. Ale pokud vytváříte novou databázi, evidentně nemůžete této databázi zadat DSN, než ji vytvoříte.
Výchozí databázi můžete změnit pomocí USE
prohlášení:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Následující CREATE TABLE
výpisy budou vytvořeny ve vaší nové databázi.
Znovu komentář od @Mike:
Udělal jsem pár testů a nevidím, že by se to stalo. Změna databáze se děje pouze na serveru a nemění nic na konfiguraci PDO v klientovi. Zde je příklad:
<?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));
Pokud je pravda, co říkáte, mělo by to fungovat bez chyby. PDO může použít daný pojmenovaný parametr více než jednou, pouze pokud má PDO::ATTR_EMULATE_PREPARES hodnotu true. Pokud tedy říkáte, že tento atribut je nastaven na true jako vedlejší efekt změny databází, pak by to mělo fungovat.
Ale to nefunguje – dostane chybu „Neplatné číslo parametru“, což znamená, že neemulované připravené příkazy zůstávají v platnosti.