簡體   English   中英

如何避免多個數據庫連接?

[英]How can I avoid multiple database connections?

我已移至PDO並為所有查詢編寫了一個小函數( SELECT/DELETE/INSERT/UPDATE ):

function pdo_query($query, $parameter)
{

    try {
        $db=new PDO("mysql:host=localhost;dbname=...","root","");
    } catch (PDOException $e) {
        die("DB-Error!");
    }
    $stmt = $db->prepare($query);
    $stmt->execute($parameter);
    if (substr($query,0,6)=="SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }

}

我在某些頁面上多次使用了此功能,因此它會產生多個數據庫連接/對象。

是否可以將連接置於查詢功能之外?

我以為這可以工作,但不能:

global $db;

try {
    $db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
    die("DB-Error!");
}

function pdo_query($query, $parameter)
{
    $stmt = $db->prepare($query);
    $stmt->execute($parameter);
    if (substr($query,0,6)=="SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }
}

有任何想法嗎?

您必須使用global $db; 在您的函數中 但是,當您開始做這樣的事情時,請問自己: “我為什么不編寫OO代碼” 編寫一個類,將$db定義$db該類的靜態成員,然后在構造函數中對其進行一次初始化。

更好的是,在基類中執行此操作,然后將該類擴展為需要查詢的各種表。 你會在路上...

global關鍵字在函數級別使用,並告訴函數從全局范圍中查找和使用變量。 要進行此工作,請執行以下操作:

function pdo_query($query, $parameter)
{
    global $db;
    $stmt = $db->prepare($query);
    ...

並刪除不再需要的初始全局聲明:

global $db;

最后,考慮將所有這些封裝在一個類中,以進行真正的面向對象編程。

無需使用全局。 無論您的函數是類方法還是函數,它都可以接受數據庫連接作為參數。 因此,您可以創建一次連接,並將其傳遞給需要它的任何函數。

function pdo_query ($connection, $query, $parameter) {
    $stmt = $connection->prepare($query);
    $stmt->execute($parameter);
    if (substr($query, 0, 6) == "SELECT") {
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        return $stmt->rowCount();
    }
}

try {
    $db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
    die("DB-Error!");
}

$result = pdo_query($db, $the_query, $the_params);

對於相同的問題,我選擇以下解決方案:
-創建一個以pdo DB作為成員的“ Dbwrapper”類。
-構造函數使用有用的信息( $this->host->user->password->db等)初始化成員,並將布爾變量$this->isconnected為false。 構造函數不會打開連接(*)。
$this->isconnected connect()方法檢查$this->isconnected的值:如果未連接,則實際上打開連接(實例化pdo成員),如果成功,則將$this->isconnected為true
-所有查詢方法都始於對connect()的調用,該調用只會執行...如果已連接,則什么也不做,否則進行連接。

因此,現在我只需要實例化一個新的Dbwrapper對象,並在每次執行查詢時都調用其查詢方法,而不必費心打開DB,它是透明地完成的,並且僅在需要時才進行。

請注意,我選擇圍繞pdo對象定義包裝器類。 您也可以考慮從pdo派生自己的類以添加此功能。

(*),因為構造函數只會執行一些變量初始化操作,並且不會打開任何連接,因此我通常會在init.php文件(以及其他整個網站范圍的變量定義)中實例化一次,該文件包含在現場。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM