Как выбрать базу данных MySQL для использования с PDO в PHP? - PullRequest
37 голосов
/ 03 января 2012

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

Ответы [ 4 ]

49 голосов
/ 03 января 2012

Обычно вы указываете базу данных в 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 может использовать заданный именованный параметр более одного раза, только если PDO :: ATTR_EMULATE_PREPARES имеет значение true. Так что, если вы говорите, что этот атрибут имеет значение true как побочный эффект изменения баз данных, то он должен работать.

Но это не работает - он выдает ошибку «Неверный номер параметра», которая указывает, что неэмулированные подготовленные операторы остаются в силе.

1 голос
/ 03 января 2012

Вы должны настраивать базу данных при создании объекта 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();
    }
?>
0 голосов
/ 20 января 2017

Обязательно вы можете выбрать базу данных 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;

Надеюсь, мой код полезен для запрошенных

0 голосов
/ 03 января 2012

Насколько я знаю, вы должны создавать новый объект для каждого соединения.Вы всегда можете расширить класс 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');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...