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

时间:2012-01-02 20:48:15

标签: 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' );

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

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

修改

我是否应该使用PDO创建新数据库?我知道使用PDO的大部分好处都会丢失在很少使用的操作上,而这些操作不会插入像CREATE DATABASE这样的数据,但是必须使用不同的连接来创建数据库,然后创建PDO连接似乎很奇怪拨打其他电话。

4 个答案:

答案 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');

一样使用它
相关问题