<?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
,請問該如何解決?主從設計模式的工作原理
在'__contruct()'我看不到的聲明'$ config'和'$ options'。這些來自哪裏? – RichardBernards 2014-11-24 09:41:59
因爲我只能在用戶傳遞查詢字符串時檢測到'SELECT'或'INSERT'行爲,所以我在那時定義使用'master'或'slave'連接。 – Chan 2014-11-25 01:30:34
不,我的意思是這些變量沒有在任何地方聲明......他們不應該保存任何數據,但是你仍然在使用它們來建立連接。因此,這些連接將無法工作。 – RichardBernards 2014-11-25 08:56:29