2012-01-02 36 views
35

我想在PHP PDO對象創建完成後選擇要使用的MySQL數據庫。我該怎麼做呢?如何選擇一個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'); 

是否存在與mysqli :: select_db等價的PDO?

也許我試圖不正確地使用PDO?請幫忙或解釋。

編輯

如果我不使用PDO來創建新的數據庫?我明白,使用PDO的大多數好處都會在很少使用的操作中丟失,該操作不會插入像CREATE DATABASE這樣的數據,但似乎很奇怪必須使用不同的連接來創建數據庫,然後創建一個PDO連接以進行其他調用。

+0

顯示一些代碼... – Jakub 2012-01-02 20:50:37

+0

您可能需要創建一個新的PDO對象連接到另一個數據庫的幫助。 – Ignas 2012-01-02 20:51:58

+2

你可以使用'select table.field from database.table',假設你連接的任何用戶ID在其他db /表上都有適當的權限。 – 2012-01-02 20:53:11

回答

44

通常在連接時將指定的DSN的數據庫。但是如果你要創建一個新的數據庫,顯然你不能在創建數據庫之前指定該數據庫。

你可以用USE聲明更改默認數據庫:

$dbh = new PDO("mysql:host=...;dbname=mysql", ...); 

$dbh->query("create database newdatabase"); 

$dbh->query("use newdatabase"); 

隨後CREATE TABLE語句將在您的newdatabase創建。從@Mike


回覆評論:

When you switch databases like that it appears to force PDO to emulate prepared statements. Setting PDO::ATTR_EMULATE_PREPARES to false and then trying to use another database will fail.

我只是做了一些測試,我沒有看到這種事情發生。更改數據庫只發生在服務器上,並且不會更改客戶端中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 :: ATTR_EMULATE_PREPARES爲真的情況下,PDO纔可以多次使用給定的命名參數。所以,如果你說這個屬性被設置爲true作爲改變數據庫的副作用,那麼它應該工作。

但它不起作用 - 它會收到一個錯誤「無效的參數號」,它表示非模擬預處理語句保持有效。

+2

真的嗎?查詢?我敢肯定你正在尋找exec – 2012-01-02 21:27:13

+3

@TomvanderWoerdt:我測試了query()和exec(),它們都工作。 query()返回一個PDOStatement對象,exec()返回受影響的行數(1表示創建,0表示使用)。對於這些語句,返回值幾乎是不相關的。 – 2012-01-02 21:34:46

+2

問題是,在打開的數據庫句柄上更改默認數據庫很容易;沒有必要打開第二個數據庫連接。 – 2012-01-02 21:36:27

0

您應該在創建PDO對象時設置數據庫。一個例子(從here

<?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(); 
    } 
?> 
-1

據我所知,你必須爲每個連接創建一個新的對象。您始終可以使用連接到多個數據庫的方法來擴展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');

+0

爲什麼在PDO中創建對象時,而不是在MySQLi中創建對象? – 2012-01-02 20:59:50

+0

嗯,我不能回答,因爲它是如何PHP的人做的:) – Ignas 2012-01-02 21:01:50

1

Obsessionally您可以選擇MySQL數據庫PHP PDO對象之後,再使用已經被創建爲波紋管我的代碼

與用途聲明..但reme​​ber在這裏使用語句是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; 

我希望我的代碼是針對所需

相關問題