簡體   English   中英

php PDO通過函數更改腳本期間的連接

[英]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.

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