2014-11-24 47 views
0
<?php 

class Database() 
{ 
    public function __conscruct() 
    { 
     $dsnMaster = 'mysql:host=' . $config['host']['master'] . ';dbname=' . $config['database'] . ';charset=utf8'; 
     $this->dbhMaster = new PDO($dsnMaster, $config['username'], $config['password'], $options); 
     $dsnSlave = 'mysql:host=' . $config['host']['slave'] . ';dbname=' . $config['database'] . ';charset=utf8'; 
     $this->dbhSlave = new PDO($dsnSlave, $config['username'], $config['password'], $options); 
    } 

    public function query($query) 
    { 
     if (preg_match('/^select /i', $query) > 0) { 
      $this->dbh = $this->dbhMaster; 
     } else { 
      $this->dbh = $this->dbhSlave; 
     } 

     $this->stmt = $this->dbh->prepare($query); 
    } 

    public function execute() 
    { 
     return $this->stmt->execute(); 
    } 

    public function beginTransaction() 
    { 
     return $this->dbh->beginTransaction(); 
    } 
} 

$db = new Database; 

try { 
    $db->beginTransaction(); 
    $db->query('SELECT * FROM `tables`'); 
    $db->execute(); 
} catch (Exception $e) { 
    // rollback here 
} 

這是我設計我的PDO的功能與主從連接CONFIGS,我檢查查詢字符串使用SELECT掌握和其他行動的奴隸,但該交易將失敗因爲我沒有在__construct中聲明$this->dbh,請問該如何解決?主從設計模式的工作原理

+0

在'__contruct()'我看不到的聲明'$ config'和'$ options'。這些來自哪裏? – RichardBernards 2014-11-24 09:41:59

+0

因爲我只能在用戶傳遞查詢字符串時檢測到'SELECT'或'INSERT'行爲,所以我在那時定義使用'master'或'slave'連接。 – Chan 2014-11-25 01:30:34

+0

不,我的意思是這些變量沒有在任何地方聲明......他們不應該保存任何數據,但是你仍然在使用它們來建立連接。因此,這些連接將無法工作。 – RichardBernards 2014-11-25 08:56:29

回答

-1

你可以使用如下

public function query($query) 
    { 
     if (strpos($query,'select') == 0) { 
      $this->dbh = $this->dbhMaster; 
     } else { 
      $this->dbh = $this->dbhSlave; 
     } 

     $this->stmt = $this->dbh->prepare($query); 
    } 
+0

這不是問題。 – 2014-11-24 10:07:33

0

嘗試只需添加一行: -

$this->dbh = $this->dbhMaster 

_construct功能

+0

我需要知道sql命令來決定應該使用什麼連接。 – Chan 2014-11-25 05:48:12