Vanligtvis skulle du ange databasen i DSN när du ansluter. Men om du skapar en ny databas kan du uppenbarligen inte ange den databasens DSN innan du skapar den.
Du kan ändra din standarddatabas med USE
uttalande:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Efterföljande CREATE TABLE
uttalanden kommer att skapas i din nya databas.
Om kommentar från @Mike:
Jag gjorde bara några tester och jag ser inte att det händer. Att ändra databasen sker bara på servern, och det ändrar ingenting i PDO:s konfiguration i klienten. Här är ett exempel:
<?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));
Om det du säger är sant, bör detta fungera utan fel. PDO kan endast använda en given namngiven parameter mer än en gång om PDO::ATTR_EMULATE_PREPARES är sant. Så om du säger att det här attributet är satt till sant som en bieffekt av att ändra databaser, så borde det fungera.
Men det fungerar inte -- det får ett felmeddelande "Ogiltigt parameternummer" som indikerar att icke-emulerade förberedda satser fortfarande gäller.