Обикновено бихте посочили базата данни в DSN, когато се свързвате. Но ако създавате нова база данни, очевидно не можете да посочите тази база данни като DSN, преди да я създадете.
Можете да промените вашата база данни по подразбиране с USE
изявление:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Следващо CREATE TABLE
изявленията ще бъдат създадени във вашата нова база данни.
Повторен коментар от @Mike:
Току що направих някои тестове и не виждам това да се случва. Промяната на базата данни се случва само на сървъра и не променя нищо относно конфигурацията на 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 като страничен ефект от промяната на бази данни, тогава трябва да работи.
Но не работи – получава грешка „Невалиден номер на параметър“, което показва, че неемулираните подготвени оператори остават в сила.