所以我一直試圖自我調試這個問題幾天,現在我似乎無法弄清楚爲什麼我沒有得到我期望的結果。在數組中存儲多個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();
}
}
[...]
}
在一個框架,我保持我允許使用PDO利用多個數據庫連接 - 這是完全可能的,並記錄錯誤,會非常方便(錯誤日誌中插入沒有得到回滾意外當主連接具有回滾)。看到更多的'$ this-> db('name')方法會有幫助。 –
我真的好奇你是否因爲對象引用而被絆倒。這是一個有趣的方法 - 很新穎。你如何使用私有$ _con成員變量? –
不是它會對你有好處:http://code.google.com/p/tgsf/source/browse/trunk#trunk%2Ftgsf_core%2Flibraries%2Fdb我使用別名在我的配置文件中創建數據庫連接對象 - 每個連接然後變成一個保存在關聯數組中的自包含對象(鍵是連接別名)當我想創建一個新的查詢對象時,我將連接名稱傳遞給它的構造函數 - 查詢對象檢索連接對象來自名爲DBM()的全局單例風格函數,並在需要與數據庫進行通信時使用它。 –