2013-10-10 139 views
-3

這裏多的時間是我的代碼如何防止連接到數據庫

pdo.php

class Connection { 
    public function __construct() { 
     $this->connect ($db); 
    } 
private function connect($db) { 
    try { 
     if (! $db){ 
        $this->db = new PDO ('mysql:host=localhost;dbname=Shopping;charset=utf8', 'xxxx', 'xxxxx'); 
        echo 'Connected'; 
        return $this->db; 
     } 
     catch (PDOException $conError) { 
     echo 'failed to connect DB' . $conError->getMessage(); 
    } 
} 
} 

product.php

class ProductInsert extends Connection { //here my function is called multiple times 
    function __construct() { 
     parent::__construct($db); 
    }  
    public function prdInsert(.....) 
    { ........} 

這裏我的問題是數據庫連接多次打開。當我打電話給productInsert()時,數據庫連接打開,我可以如何防止這種情況

+0

你需要關閉你的數據庫連接後,你使用它。 –

+0

謝謝,但我認爲這將是數據庫的負擔,因爲我的程序調用productInsert()很多次 –

+0

爲什麼要擴展連接類來編寫函數?數據庫連接在每次被調用的構造中進行 – codepixlabs

回答

0

這裏是解決
pdo.php

class Connection { 
// Declare instance 
private static $instance = NULL; 
// the constructor is set to private so so nobody can create a new instance using new 
private function __construct() { 
// maybe set the db name here later 
} 
// Return DB instance or create intitial connection @return object (PDO) @access public 
public static function getInstance() { 
    if (! self::$instance) { 
     self::$instance = new PDO ('mysql:host=localhost;dbname=Shopping;charset=utf8', 'root', 'vss0ftech'); 
     self::$instance->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     echo 'connected'; 
    } else 
     echo 'connection is already existed'; 
    return self::$instance;  
} 
// Like the constructor, we make __clone private so nobody can clone the instance 
PRIVATE FUNCTION __CLONE() { 
} 
} 

product.php

在這裏我們可以調用方法,這樣

class ProductInsert { 
    public function prdInsert(.....) { 
     $result_By_Vendor_And_Title = Connection::getInstance()->query ("select * from........) 
    } 
    } 
0
class Connection { 
     public function __construct($db) { 
     return $this->connect($db); 
     } 
     private function connect($db) { 
     try { 
     if (! $db){ 
     $db = new PDO ('mysql:host=localhost;dbname=Shopping;charset=utf8', 'xxxx', 'xxxxx'); 
     echo 'new connection'; 
     } 
     return $db; 
     } 
     catch (PDOException $conError) { 
     echo 'failed to connect DB' . $conError->getMessage(); 
     }  

     } 
} 
+0

謝謝。我已經試過這一個它顯示注意:未定義的屬性:ProductInsert :: $ db –

+0

什麼是$ db變量?你可以從你的代碼中移除它嗎? – cur4so

+0

$ db變量是一個PDO對象,沒有這個(PDO對象)我如何向前移動(就像在db中寫入問題)? –

1

不要從數據庫類擴展你的應用程序類。

這是您的主要問題。
他們是太不同的類沒有共同之處。
所以你必須使用你的db對象作爲屬性

連接類目前也沒用,因爲它只是PDO的漏洞僞裝。

所以,只要創建原始PDO對象,然後通過它在產品

class ProductInsert 
{ 
    function __construct(PDO $db) 
    { 
     $this->db = $db; 
    }  
    public function prdInsert(.....) 
} 

的構造函數和老天爺,學會縮進代碼。

+0

謝謝,但直到現在我也得到通知:undefined var db請詳細說明 –

+0

**您必須創建原始PDO對象,然後在產品**的構造函數中傳遞它。'$ procuct = new ProductInsert($ pdo);' –

+0

既然您在談論「is-a」關係,您可能需要注意他的** Liskov替換原則**。但是+1 – Yang