2013-02-18 83 views
0

我是使用PDO的新手,我想設置它,以便在需要時可以有多個數據庫。所以我創建了一個函數,允許你傳遞一個數據庫名稱,以便在什麼時候使用。使用PDO的多個數據庫

它在某種程度上起作用,因爲它在選擇您傳入的數據庫中,但即使數據庫被省略或不正確,它仍允許您從似乎隨機選擇的數據庫中選擇表和行在MySQL用戶。

這不是我想的一個主要問題,但我想知道它將不會選擇任何數據,除非數據庫已通過我的函數傳遞。

我的代碼如下,我將不勝感激您的想法,我可能會更好地處理這個問題。謝謝。

的index.php

require 'app/cream.php'; 

try { 

    $db = new Cream_Model(); 
    $db = $db->selectDb('cream'); 

    $data = $db->query('SELECT * FROM users'); 
    foreach($data as $row) { 
     print_r($row); 
    } 

} catch(PDOException $e) { 

    echo 'An error has occurrred: ' . $e->getMessage() . '<br />'; 

} 

Model.php

class Model { 

    public $connection; 

    public function connect() { 

     try { 

      $connection = new PDO(DB_DSN . ':' . DB_HOST, DB_USERNAME, DB_PASSWORD, array(PDO::ATTR_PERSISTENT => true)); 
      $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

     } catch(PDOException $e) { 

      echo 'An error has occurred: ' . $e->getMessage() . '<br />'; 
      die(); 

     } 

     return $connection; 

    } 

} 

Cream_Model.php

class Cream_Model extends Model { 

    public $conn; 

    public function selectDb($db) { 

     try { 

      $conn = $this->connect(); 
      $conn->exec("USE $db"); 

     } catch(PDOException $e) { 

      echo 'An error has occurred: ' . $e->getMessage() . '<br />'; 

     } 

     return $conn; 

    } 

} 
+0

對於PDO,您不應該直接執行'使用dbname'。相反,在連接字符串中指定dbname,如['mysql:host = localhost; dbname = testdb'](http://php.net/manual/en/ref.pdo-mysql.connection.php) – mvp 2013-02-18 09:25:04

回答

2

對於PDO,你建議立即進行刪除d不直接執行USE dbname

我認爲發生了什麼,你有多個PHP腳本實例,並且當每個執行USE dbname沒有PDO意識到它發生,並且這導致整個混亂。

相反,您應該在您的PDO連接字符串中指定dbname,如'mysql:host=localhost;dbname=testdb'。這意味着創建Model類後,您不能真正在數據庫之間切換。你應該知道你的數據庫名稱並在模型構造函數中使用它。

瞭解更多PDO documentation

+0

爲什麼你不應該使用exec(「USE dbname」)?是否有一個原因? – 2013-02-18 09:44:55

+1

因爲PDO被設計爲供應商不可知的數據庫連接層。其他供應商(甲骨文,Postgres等)沒有'USE dbname'或其等價物。通過直接執行USE,PDO會失去跟蹤哪個數據庫實際上是最新的 - 不要這樣做。相反,你可以在你的連接字符串中指定dbname – mvp 2013-02-18 09:48:15

+0

好吧,這很有道理,但必須有一種方法才能正確使用多個數據庫。基本上我想要一個連接類,然後將數據庫傳遞給連接。 – 2013-02-18 10:05:06