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

2022-08-30 11:41:59

我想选择一个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连接以进行其他调用似乎很奇怪。CREATE DATABASE


答案 1

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

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

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

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

$dbh->query("use newdatabase");

后续语句将在 new 数据库中创建。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 是更改数据库的副作用,那么它应该有效。

但它不起作用 - 它得到一个错误“无效的参数编号”,这表明非模拟的预准备语句仍然有效。


答案 2

您应该在创建 PDO 对象时设置数据库。一个示例(来自此处))

<?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();
    }
?>

推荐