通常,在连接时,会在 DSN 中指定数据库。但是,如果要创建新数据库,显然无法在创建该数据库之前将其指定为 DSN。
您可以使用以下语句更改默认数据库:USE
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
后续语句将在 new 数据库中创建。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::ATTR_EMULATE_PREPARES 为 true 时,PDO 才能多次使用给定的命名参数。因此,如果您说此属性设置为 true 是更改数据库的副作用,那么它应该有效。
但它不起作用 - 它得到一个错误“无效的参数编号”,这表明非模拟的预准备语句仍然有效。