2012-09-20 50 views
2

所以我一直試圖自我調試這個問題幾天,現在我似乎無法弄清楚爲什麼我沒有得到我期望的結果。在數組中存儲多個pdo連接

我的代碼相當複雜,並且要建立數據庫連接,它跨越3個類和一個配置文件。

但基本上我的最終用途最終被

$this->db('test')->query('SELECT * FROM test1');

此建立由test查詢結果返回別名到我的數據庫的連接,所以我好爲止。

現在我的問題是當我嘗試製作一個新的PDO對象。

$this->db('test2')->query('SELECT * FROM test2');

因爲沒有桌子我test1對象調用test2這個沒有返回值。

,但如果我這樣做

$this->db('test2')->query('SELECT * FROM test1');

現在這個返回從第一PDO對象相同的結果。

我已經追蹤並追蹤了每行代碼,以確保正確的參數正在傳遞給我的數據庫類,並且每個連接都已正確建立到相應的數據庫。

現在我的問題是,你可以有多個數據庫pdo連接?如果有的話是否需要在PDO選項中設置特殊標誌?我的連接被緩存在什麼地方並導致這種混淆?

這是在每個新的類對象我的PDO聲明存儲在我的陣列連接的

try 
     { 
      $this->_con = new PDO(
       "mysql:host=" . $host . "; 
       port=" . $port . "; 
       dbname=" . $name, $user, $pass 
      ); 

      $this->_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     } catch(PDOException $e) { 

      // TODO: push all $e methods to the developer debugger 
      echo "Database Error: ". $e->getMessage(); 
     } 

編輯我的代碼使用該連接

步驟1:父類的呼叫

public function __call($name, $params) 
     { 
      $class = $name . '_system_helper'; 
      $hash = md5($class . $params); 

      if (class_exists($class)) 
      { 
       if (!array_key_exists($hash, $this->_sys_helper)) 
       { 
        if (method_exists($class, 'init')) 
        { 
         $this->_sys_helper[$hash] = call_user_func_array(array($class, 'init'), $params); 

        } else { 

         $this->_sys_helper[$hash] = call_user_func_array($class, $params); 
        } 
       } 

       return $this->_sys_helper[$hash]; 
      } 

      return null; 
     } 

第2步:從父級調用

class DB_System_Helper extends Jinxup 
    { 
     private $_con = null; 

     public function __construct($end = null) 
     { 
      $mode = null; 
      $host = null; 
      $name = null; 
      $user = null; 
      $pass = null; 
      $port = null; 

      if (isset($this->config['database']['mode'])) 
      { 
       $mode = $this->config['database']['mode'] == 'production' ? 'production' : 'development'; 

       if (count($this->config['database'][$mode]) > 1) 
       { 
        foreach ($this->config['database'][$mode] as $key => $database) 
        { 
         if ($database['@attr']['alias'] == $end) 
         { 
          $host = $this->config['database'][$mode][$key]['host']; 
          $name = $this->config['database'][$mode][$key]['name']; 
          $user = $this->config['database'][$mode][$key]['user']; 
          $pass = $this->config['database'][$mode][$key]['pass']; 
          $port = $this->config['database'][$mode][$key]['port']; 
         } 
        } 

       } else { 

        $host = $this->config['database'][$mode]['host']; 
        $name = $this->config['database'][$mode]['name']; 
        $user = $this->config['database'][$mode]['user']; 
        $pass = $this->config['database'][$mode]['pass']; 
        $port = $this->config['database'][$mode]['port']; 
       } 

       $this->_con = new PDO_Database_Helper($host, $name, $user, $pass, $port); 

      } else { 

       echo 'No database mode specified'; 
      } 
     } 

     public function __call($name, $param) 
     { 
      return call_user_func_array(array($this->_con, $name), $param); 
     } 
    } 

第3步:從DB_System_Helper

class PDO_Database_Helper extends Jinxup 
{ 
    private $_con = null; 
    private $_id = 0; 

    public function __construct($host, $name, $user, $pass, $port = 3306) 
    { 
     try 
     { 
      $this->_con = new PDO(
       "mysql:host=" . $host . "; 
       port=" . $port . "; 
       dbname=" . $name, $user, $pass 
      ); 

      $this->_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     } catch(PDOException $e) { 

      // TODO: push all $e methods to the developer debugger 
      echo "Database Error: ". $e->getMessage(); 
     } 
    } 

     [...] 
} 
+0

在一個框架,我保持我允許使用PDO利用多個數據庫連接 - 這是完全可能的,並記錄錯誤,會非常方便(錯誤日誌中插入沒有得到回滾意外當主連接具有回滾)。看到更多的'$ this-> db('name')方法會有幫助。 –

+0

我真的好奇你是否因爲對象引用而被絆倒。這是一個有趣的方法 - 很新穎。你如何使用私有$ _con成員變量? –

+0

不是它會對你有好處:http://code.google.com/p/tgsf/source/browse/trunk#trunk%2Ftgsf_core%2Flibraries%2Fdb我使用別名在我的配置文件中創建數據庫連接對象 - 每個連接然後變成一個保存在關聯數組中的自包含對象(鍵是連接別名)當我想創建一個新的查詢對象時,我將連接名稱傳遞給它的構造函數 - 查詢對象檢索連接對象來自名爲DBM()的全局單例風格函數,並在需要與數據庫進行通信時使用它。 –

回答

1

叫你確定你正在做的散列足以「命名空間」的$this->_sys_helper陣列中的每個連接?

我懷疑問題在於第一階段。

public function __call($name, $params) 
    { 
     $class = $name . '_system_helper'; 
     $hash = md5($class . $params); 

     if (class_exists($class)) 
     { 
      if (!array_key_exists($hash, $this->_sys_helper)) 
      { 
       if (method_exists($class, 'init')) 
       { 
        $this->_sys_helper[$hash] = call_user_func_array(array($class, 'init'), $params); 

       } else { 

        $this->_sys_helper[$hash] = call_user_func_array($class, $params); 
       } 
      } 

    >>>>>>>>>>>>>> are you sure this is not returning the wrong 
    >>>>>>>>>>>>>> connection because of how the hashing is working? 
      return $this->_sys_helper[$hash]; 
     } 

     return null; 
    } 
+0

我沒有那麼多的幫助文件,因爲那裏有碰撞的地方,但我認爲你是對的我可能會跳到對象引用的地方 – Eli

+0

我認爲你更有可能試圖用不同的設置數據創建2個不同的助手 - 對象類型是相同的 - 但你需要確保它是從你身上傳出來的r數組正確。 –

+0

亞哈希匹配,我確實看穿,並確保我正在返回正確的對象。是我看到的第一件事。問題是我的代碼被創建爲只有一個數據庫連接,但由於發現我需要更多的連接,因此我修改了代碼以允許更多的對象被別名存儲 – Eli