そのため、私はこの問題を数日間自分でデバッグしようとしていますが、期待した結果が得られない理由がわからないようです。
私のコードはかなり複雑で、DB接続を確立するには、3つのクラスと1つの構成ファイルにまたがっています。
しかし、基本的に私の最終的な使用法は
$this->db('test')->query('SELECT * FROM test1');
これにより、クエリのエイリアスによってデータベースへの接続が確立され、test
結果が返されるので、これまでのところ問題ありません。
今、私の問題は、新しいPDO
オブジェクトを作成しようとしたときです。
$this->db('test2')->query('SELECT * FROM test2');
オブジェクトに呼び出さtest2
れたテーブルがないため、これは何も返しません。test1
しかし、私がこれを行う場合
$this->db('test2')->query('SELECT * FROM test1');
これで、最初のPDOオブジェクトから同じ結果が返されます。
コードのすべての行をトレースおよび追跡して、正しいパラメーターがデータベースクラスに渡されていること、および各接続が対応するデータベースに適切に確立されていることを確認しました。
今私の質問は、複数のdatbase 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();
}
}
[...]
}