Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中选择与PDO一起使用的MySQL数据库?_Php_Mysql_Pdo - Fatal编程技术网

如何在PHP中选择与PDO一起使用的MySQL数据库?

如何在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

我想选择一个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->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;