![](/img/trans.png)
[英]php mysql : how to avoid multiple connections to database in a Class?
[英]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.