Normalmente, você especificaria o banco de dados no DSN ao se conectar. Mas se você estiver criando um novo banco de dados, obviamente não poderá especificar o DSN desse banco de dados antes de criá-lo.
Você pode alterar seu banco de dados padrão com o
USE
demonstração:$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Subseqüente
CREATE TABLE
instruções serão criadas em seu novo banco de dados. Comentário de @Mike:
Acabei de fazer alguns testes e não vejo isso acontecendo. A alteração do banco de dados ocorre apenas no servidor, e não altera em nada a configuração do PDO no cliente. Aqui está um exemplo:
<?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));
Se o que você está dizendo é verdade, isso deve funcionar sem erros. O PDO pode usar um determinado parâmetro nomeado mais de uma vez somente se PDO::ATTR_EMULATE_PREPARES for true. Portanto, se você está dizendo que esse atributo está definido como true como um efeito colateral da alteração de bancos de dados, deve funcionar.
Mas não funciona -- ele recebe um erro "Número de parâmetro inválido" que indica que as instruções preparadas não emuladas permanecem em vigor.