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

T. *_*nes 37 php mysql pdo

我想在已经创建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' );
Run Code Online (Sandbox Code Playgroud)

是否有一个等效于mysqli :: select_db的PDO?

也许我正在尝试不正确地使用PDO?请帮忙或解释.

编辑

我不应该使用PDO来创建新数据库吗?我知道使用PDO的大部分好处都会丢失在很少使用的不插入数据的操作上CREATE DATABASE,但是必须使用不同的连接来创建数据库,然后创建PDO连接以进行其他调用似乎很奇怪.

Bil*_*win 49

通常,您在连接时将在DSN中指定数据库.但是,如果您正在创建新数据库,显然您无法在创建DSN之前将该数据库指定为该数据库.

您可以使用以下USE语句更改默认数据库:

$dbh = new PDO("mysql:host=...;dbname=mysql", ...);

$dbh->query("create database newdatabase");

$dbh->query("use newdatabase");
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

如果你说的是真的,那么这应该没有错误.仅当PDO :: ATTR_EMULATE_PREPARES为true时,PDO才能多次使用给定的命名参数.因此,如果你说这个属性设置为true作为更改数据库的副作用,那么它应该工作.

但它不起作用 - 它会收到错误"无效参数编号",表示未仿真的预准备语句仍然有效.

  • PDO :: query()在内部执行prepare(),后跟execute().并非所有MySQL语句都可以与prepare一起运行.请参阅"准备好的语句中允许的SQL语法"部分中的http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html. (6认同)
  • @TomvanderWoerdt:我测试了query()和exec(),它们都有效.query()返回一个PDOStatement对象,exec()返回受影响的行数(1表示创建,0表示使用).对于这些陈述,返回值几乎无关紧要. (3认同)
  • 真?查询?我很确定你在找exec (2认同)
  • 关键是在开放的db句柄上更改默认数据库很容易; 没有必要打开第二个数据库连接. (2认同)