如何在PHP中选择与PDO一起使用的MySQL数据库?
我想选择一个MySQL数据库,在PHP PDO对象创建之后使用。我该怎么做如何在PHP中选择与PDO一起使用的MySQL数据库?,php,mysql,pdo,Php,Mysql,Pdo,我想选择一个MySQL数据库,在PHP PDO对象创建之后使用。我该怎么做 // create PDO object and connect to MySQL $dbh = new PDO( 'mysql:host=localhost;', 'name', 'pass' ); // create a database named 'database_name' // select the database we just created ( this does not work ) $dbh
// create PDO object and connect to MySQL
$dbh = new PDO( 'mysql:host=localhost;', 'name', 'pass' );
// create a database named 'database_name'
// select the database we just created ( this does not work )
$dbh->select_db( 'database_name' );
是否存在与mysqli::select_db等效的PDO
也许我试图不正确地使用PDO?请帮助或解释
编辑
我不应该使用PDO来创建新数据库吗?我知道,使用PDO的大部分好处都在一个很少使用的操作中丢失了,该操作不插入数据,如
创建数据库
,但必须使用不同的连接来创建数据库似乎很奇怪,然后创建PDO连接以进行其他调用。创建PDO对象时,应该设置数据库。一个例子(来自)
据我所知,您必须为每个连接创建一个新对象。您始终可以使用连接到多个数据库的方法来扩展PDO类。然后根据您的喜好使用它:
public function pickDatabase($db) {
if($db == 'main') {
return $this->db['main']; //instance of PDO object
else
return $this->db['secondary']; //another instance of PDO object
}
使用它就像
$yourclass->pickDatabase('main')->fetchAll('your stuff')代码>连接时,通常需要在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_设置为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));
或者,您可以选择在创建PHP PDO对象后使用的MySQL数据库,如下所示:
With USE语句。但请记住这里的USE语句是mysql命令
try
{
$conn = new PDO("mysql:host=$servername;", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("use databasename");
//application logic
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
试试看
{
$conn=newpdo(“mysql:host=$servername;”,$username,$password);
//将PDO错误模式设置为异常
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$conn->exec(“使用数据库名”);
//应用逻辑
}
捕获(PDO$e)
{
echo$sql。“
”$e->getMessage();
}
$conn=null;
我希望我的代码对请求的有帮助。您可能需要创建一个新的PDO对象来连接到另一个数据库。您可以使用
从database.table
选择table.field,假设您连接的任何用户ID都对其他db/表具有相应的权限。创建新对象有什么错?一旦运行“创建数据库”之类的查询,您就可以轻松地销毁它并继续使用新连接。我真的看不出有什么问题。这似乎是一件愚蠢的事情,这通常意味着我做错了别的事情。也许这只是一个边缘案例。PDO可能不经常用于创建新数据库。@Ignas:在我的测试中,打开到数据库的连接(实例化PDO)大约需要23毫秒。我有数百个数据库;它使我的脚本比使用use
语句花费的时间长4倍。为什么在PDO中而不是在MySQLi中创建对象时必须设置它?我无法回答这个问题,因为PHP人员就是这样做的:)真的吗?查询我很确定你在找exec@TomvanderWoerdt:我测试了query()和exec(),它们都可以工作。query()返回PDOStatement对象,exec()返回受影响的行数(1表示创建,0表示使用)。对于这些语句,返回值几乎是无关的;没有必要再打开一个数据库连接。@Mike,我想你弄错了。请参阅上面的测试用例。PDO::query()在内部执行prepare()和execute()。并非所有MySQL语句都可以使用prepare运行。请参阅“准备好的语句中允许使用SQL语法”一节。您只是重复了5年前其他人说过的话。
try
{
$conn = new PDO("mysql:host=$servername;", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("use databasename");
//application logic
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;