Подтвердить что ты не робот

Как выбрать базу данных 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, чтобы сделать другие вызовы.

4b9b3361

Ответ 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');