我想在创建PHP PDO对象后选择要使用的MySQL数据库。我该怎么做?
// 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的大部分好处都会丢失在很少使用的操作上,而这些操作不会插入像CREATE DATABASE
这样的数据,但是必须使用不同的连接来创建数据库,然后创建PDO连接似乎很奇怪拨打其他电话。
答案 0 :(得分:49)
通常,您在连接时会在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 :: ATTR_EMULATE_PREPARES为true时,PDO才能多次使用给定的命名参数。因此,如果你说这个属性设置为true作为更改数据库的副作用,那么它应该工作。
但它不起作用 - 它会收到错误“无效的参数编号”,表示未模拟的预准备语句仍然有效。
答案 1 :(得分:1)
您应该在创建PDO对象时设置数据库。一个例子(来自here)
<?php
$hostname = "localhost";
$username = "your_username";
$password = "your_password";
try {
$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
echo "Connected to database"; // check for connection
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
答案 2 :(得分:0)
有人可以选择一个MySQL数据库,以便在创建PHP PDO对象后使用我的代码
使用USE STATEMENT ..但请记住,USE STATEMENT是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
//.......
//application logic
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
我希望我的代码对请求的
有帮助答案 3 :(得分:-1)
据我所知,您必须为每个连接创建一个新对象。您始终可以使用连接到多个数据库的方法扩展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');