Обычно вы указываете базу данных в DSN при подключении. Но если вы создаете новую базу данных, очевидно, что вы не можете указать эту базу данных DSN, прежде чем создавать ее.
Вы можете изменить базу данных по умолчанию с помощью оператора USE
:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Последующие CREATE TABLE
операторы будут созданы в вашей новой базе данных.
Комментарий от @Mike:
Когда вы переключаете базы данных подобным образом, это заставляет PDO эмулировать подготовленные операторы. Если для параметра PDO :: ATTR_EMULATE_PREPARES задано значение false, а затем попытка использовать другую базу данных не удастся.
Я только что провел несколько тестов, и я не вижу, чтобы это произошло. Изменение базы данных происходит только на сервере, и это ничего не меняет в конфигурации PDO на клиенте. Вот пример:
<?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));
Если то, что вы говорите, верно, то это должно работать без ошибок. PDO может использовать заданный именованный параметр более одного раза, только если PDO :: ATTR_EMULATE_PREPARES имеет значение true. Так что, если вы говорите, что этот атрибут имеет значение true как побочный эффект изменения баз данных, то он должен работать.
Но это не работает - он выдает ошибку «Неверный номер параметра», которая указывает, что неэмулированные подготовленные операторы остаются в силе.