通常,连接时会在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
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 的副作用,那么它应该可以工作。
但它并不起作用——它会得到一个错误“Invalid parameter number”,这表明非模拟准备语句仍然生效。
select table.field from database.table
语句。 - Marc B