Как выбрать базу данных MySQL для использования с PDO в PHP?
Я хочу выбрать базу данных 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' );
Существует ли PDO, эквивалентный mysqli:: select_db?
Возможно, я пытаюсь неправильно использовать PDO? Пожалуйста, помогите или объясните.
ИЗМЕНИТЬ
Должен ли я использовать PDO для создания новых баз данных? Я понимаю, что большинство преимуществ использования PDO теряются в редко используемой операции, которая не вставляет данные типа CREATE DATABASE
, но, похоже, странно, что нужно использовать другое соединение для создания базы данных, а затем создать соединение PDO, чтобы сделать другие вызовы.
Ответы
Ответ 1
Обычно вы указываете базу данных в DSN при подключении. Но если вы создаете новую базу данных, очевидно, что вы не можете указать эту базу данных DSN перед ее созданием.
Вы можете изменить базу данных по умолчанию с помощью инструкции USE
:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Последующие операторы CREATE TABLE
будут созданы в вашей новой базе данных.
Re comment from @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 может использовать данный именованный параметр более одного раза, только если PDO:: ATTR_EMULATE_PREPARES истинно. Поэтому, если вы говорите, что этот атрибут установлен как истинный как побочный эффект изменения баз данных, тогда он должен работать.
Но это не сработает - появляется ошибка "Недопустимый номер параметра", который указывает, что неэмулированные подготовленные операторы остаются в силе.
Ответ 2
В общенациональном режиме вы можете выбрать базу данных 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
Вы должны настроить базу данных при создании объекта 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();
}
?>
Ответ 4
Насколько я знаю, вам нужно создать новый объект для каждого соединения. Вы всегда можете расширить класс 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');