[英]php PDO change connection during script via function
我有一個應用程序,出於客戶端保護的原因,必須使用多個數據庫,並使用一個核心數據庫進行管理-例如用戶詳細信息存儲。 我很感激有必要從mysql擴展中遷移(很快就會棄用),我首先嘗試了mysqli,但是即使使用change_user函數也無法擺脫持久連接,可能是因為使用了相同的用戶/密碼組合,所以數據庫聯接是可能的。
我在遷移過程中實現了許多存儲過程,以減少瓶頸。 MYSQL現在將SP分配給每個特定的數據庫,因此在進行CALL時連接到正確的數據庫非常重要。 這意味着在查詢中放置完整的database.table引用是不實際的
所以我轉向了PDO。
我創建了一個測試腳本:
$db_host="localhost";
$db_username='root';
$db_pass='';
$add='admin';
$db_name='host_base_name'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result= $db->query("SELECT firstname from centralusers WHERE usr_id='1'");
while($row=$result->fetch(PDO::FETCH_ASSOC)){echo $row['firstname']."<br>";}
}
catch(PDOException $e){echo $e->getMessage();}
$add='test';
$db_name='host_base_name_'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result= $db->query("SELECT stage_desc from action_stage WHERE stage_id='1'");
while($row=$result->fetch(PDO::FETCH_ASSOC)){echo $row['stage_desc']."<br>";}
}
catch(PDOException $e){echo $e->getMessage();}
切換成功完成了-我嘗試了三個數據庫,但沒有顯示第三個數據庫的經濟性。
但是,在開發代碼中,我的腳本有一個“ require”文件,其中包含處理連接的功能。 通過調用將其發送到表名的最后一部分(在mysql擴展中運行良好的過程。
function db_connect($add) {
$db=NULL;
$db_host="localhost";
$db_username='root';
$db_pass='';
$db_name='host_base_name_'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(PDOException $e){echo $e->getMessage();}
return $db;
}
在第二次調用(更改數據庫)之后,我的下一個查詢產生一個錯誤,即找不到該表-並將表引用的“ host_base_name_”部分作為原始表給出。 我以為NULL調用會破壞實例。
如果我把$ db = NULL; 在調用腳本中,在該函數之前,我得到了“對非對象的成員函數query()的調用”的Scream錯誤。
為什么一個起作用而另一個不起作用,因為它們看起來相同,我又該如何解決?
每個數據庫都有單獨的PDO
$db_host="localhost";
$db_username='root';
$db_pass='';
$add='admin';
$db_name1='host_base_name'.$add1;One database
$db_name2='host_base_name'.$add2;Other database
try{
//PDO for one database
$db1= new PDO('mysql:host='.$db_host.';dbname='.$db_name1,$db_username,$db_pass);
$db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//PDO for other database
$db2= new PDO('mysql:host='.$db_host.';dbname='.$db_name1,$db_username,$db_pass);
$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
對於將來遇到這種情況的人,我發現確實可以用一個類替換函數調用,並創建與其他數據庫的新連接。 一路走來,我發現通過將“ localhost”替換為“ 127.0.0.1”,極大地提高了速度-將測試腳本的執行時間從0.0060秒減少到0.0029,這在復雜腳本中非常重要。
這就是我的類-因為無論如何它都包含在腳本的頂部,所以我將主要連接參數放在include的開頭,以便可以在類中使用它們。 $ db_name在腳本中被修改,因此它引用了正確的數據庫。
$db_host='127.0.0.1';
$db_user='root';
$db_pass='';
$db_name='host_base_name';
class databaseConnect{
public function connect($db_host, $db_user,$db_pass,$db_name){
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_user,$db_pass, array(PDO::ATTR_PERSISTENT=>false));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(PDOException $e){echo "Error: ".$e->getMessage()."<br />"; die(); }
return $db;
}
}
我得到了新的數據庫連接實例(在這種情況下,使用下面的代碼將其轉換為“ host_base_nametest”:在我必須切換數據庫時,我用另一個變量替換了$ con,從本質上講,我在連接內可以完全靈活且可移植的方式命名數據庫:
$add='test'; // in production this comes from another variable
$db_inst=$db_name.$add; //builds the database name
$con=new databaseConnect; //calls the class
$db=$con->connect($db_host, $db_user,$db_pass,$db_inst); //gets the new instance
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.