所以我几天来一直在尝试自己调试这个问题,但我似乎无法弄清楚为什么我没有得到我期望的结果。
我的代码相当复杂,要建立一个数据库连接,它跨越 3 个类和一个配置文件。
但基本上我的最终用途最终是
$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 对象返回相同的结果。
我已经跟踪并追踪了每一行代码,以确保将正确的参数传递给我的数据库类,并且每个连接都正确建立到相应的数据库。
现在我的问题是,您可以拥有多个数据库 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();
}
编辑我使用连接的代码
第一步:调用父类
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;
}
第二步:从父类调用
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();
}
}
[...]
}