2012-03-15 45 views
7

我對PDO很陌生,也是一般的PHP的OOP,所以請大家好:)基本上我試圖建立一個基於PDO的連接對象,這樣我就可以在我的網站中調用一個連接。製作PDO mysql靜態連接類的最佳方法?

我需要一些準備好的語句,根據我通過使用下面要創建的同一個數據庫對象的標識查找不同的結果。

如何製作和訪問我在下面設置的db類,然後使用它中的函數來提取我需要的相關信息?任何例子都很棒,所以我可以瞭解最佳實踐等。

非常感謝提前。

class db { 

    private static $connection; 

    private function __construct(){} 
    private function __clone(){} 

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") { 
     if(!$this->connection){ 
      try{ 
       $this->connection = new PDO($db_server, $db_user, $db_pass); 
      } catch (PDOException $e) { 
       $this->connection = null; 
       die($e->getMessage()); 
      } 
     } 
     return $this->connection; 
    } 

} 

$dbh = new db::connect(); 

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?"); 
if($stmt->execute(array($_REQUEST['testid']))) { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} 
+0

僞變量$這在靜態方法和靜態屬性中不可用。你應該使用self :: $屬性。否則,它會說屬性db :: property not defined – jscripter 2016-03-18 15:25:01

+0

@BubuDaba不會在問題中編輯不正確的代碼,因爲它可以使其他asnwers不相關。如果你對OP有一個建議,那麼寫一個答案或一個評論 – 2016-03-18 16:21:42

回答

5

您可以通過不使用過Singleton模式重新開始。它(和一般的靜態類)對於程序設計中的全局變量不好的所有原因都是不好的。

這就是說...而不是試圖強制連接對象的唯一性,你應該只是確保你在同一地點使用相同的連接。

這裏是什麼,我的意思了一個例子:

class Foo 
{ 
    protected $connection = null; 
    public function __construct(PDO $connection) 
    { 
     $this->connection = $connection; 
    } 
} 

class Bar 
{ 
    // all the same as in Foo 
} 

$connection = new PDO('sqlite::memory'); 

$foo = new Foo($connection); 
$bar = new Bar($connection); 

在這一點上兩者$foo$bar對象將有機會獲得相同 PDO實例。如果你有一個需要訪問數據庫的對象,那麼你只需要在構造函數中提供一個連接。

有可能是您想觀看兩個視頻(幻燈片將包含Java代碼,但你應該沒有troble理解它):

+0

爲什麼你說靜態類通常是不好的 - 我爲我自己的PDO包裝器使用靜態類...似乎對我很好。我們應該避免他們有什麼特別的原因嗎? – BenOfTheNorth 2012-03-18 02:13:22

+0

@BenGriffiths,有幾個原因。主要的問題是用*靜態類*你不能使用多態。方法的執行與類的**名稱**相關聯。這也不是真的OOP。靜態類實際上只用於展示。你有什麼是函數列表,綁定在命名空間ish結構中。無論如何,你應該研究這個問題。有很多材料。如果你願意學習一些更好的做法,你可以從這裏開始(http://kore-nordmann.de/blog/0103_static_considered_harmful.html)。 – 2012-03-18 02:48:44

+0

謝謝,我會研究它。我個人使用靜態的理由是因爲我不必在整個地方聲明類,或者不必將它傳遞給其他對象 - 它作爲一種常量對象是有用的。在我的情況下,我不需要一個龐大的課程,但是將它包裝在一個小型的靜態課堂中可以讓它更加整潔,更容易管理。 – BenOfTheNorth 2012-03-18 16:46:37

0

持久連接是建立在:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true 
)); 

Example #4 Persistent connections

+0

即使它沒有提供原始問題的答案,也許它應該發佈爲評論...'/ *或者也許是因爲你的*/class Answer extends LogicException {};嘗試{$ to = include('some/more.php');''和$ re = new Answer(); if('want'== $ to);} catch(Points $ for){new Answer( )或死($ for.'this');}' – 2012-10-09 19:16:15

+2

有一個喜劇演員在這裏。 – 2013-02-16 22:15:56