Typisk vil du angive databasen i DSN, når du opretter forbindelse. Men hvis du opretter en ny database, kan du naturligvis ikke angive databasens DSN, før du opretter den.
Du kan ændre din standarddatabase med USE
erklæring:
$dbh = new PDO("mysql:host=...;dbname=mysql", ...);
$dbh->query("create database newdatabase");
$dbh->query("use newdatabase");
Efterfølgende CREATE TABLE
udsagn vil blive oprettet i din nye database.
Rekommentar fra @Mike:
Jeg har lige lavet nogle test, og det kan jeg ikke se ske. Ændring af databasen sker kun på serveren, og det ændrer ikke noget ved PDO's konfiguration i klienten. Her er et eksempel:
<?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));
Hvis det, du siger, er sandt, burde dette fungere uden fejl. PDO kan kun bruge en given navngivet parameter mere end én gang, hvis PDO::ATTR_EMULATE_PREPARES er sand. Så hvis du siger, at denne attribut er sat til sand som en bivirkning af at ændre databaser, så burde den virke.
Men det virker ikke -- det får fejlen "Ugyldigt parameternummer", som indikerer, at ikke-emulerede forberedte sætninger forbliver i kraft.