【发布时间】:2014-02-13 10:49:17
【问题描述】:
我有一个应用程序必须使用多个数据库,以保护客户端并使用核心数据库进行归档以进行管理 - 例如用户详细信息存储。我很欣赏需要从 mysql 扩展(即将被弃用)迁移,我首先尝试了 mysqli,但无法摆脱持久连接,即使使用 change_user 函数,可能是因为使用了相同的用户/密码组合,所以交叉-数据库连接是可能的。
我在迁移期间实现了许多存储过程以减少瓶颈。 MYSQL 现在将 SP 分配给每个特定的数据库,因此在进行 CALL 时连接到正确的数据库非常重要。这意味着在查询中放置完整的 database.table 引用是不切实际的
所以我转向了 PDO。
我创建了一个测试脚本:
$db_host="localhost";
$db_username='root';
$db_pass='';
$add='admin';
$db_name='host_base_name'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result= $db->query("SELECT firstname from centralusers WHERE usr_id='1'");
while($row=$result->fetch(PDO::FETCH_ASSOC)){echo $row['firstname']."<br>";}
}
catch(PDOException $e){echo $e->getMessage();}
$add='test';
$db_name='host_base_name_'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result= $db->query("SELECT stage_desc from action_stage WHERE stage_id='1'");
while($row=$result->fetch(PDO::FETCH_ASSOC)){echo $row['stage_desc']."<br>";}
}
catch(PDOException $e){echo $e->getMessage();}
这成功地进行了切换 - 我尝试了三个数据库,但没有显示第三个数据库。
但是,在开发代码中,我的脚本有一个“要求”文件,其中包含一个处理连接的函数。它通过调用发送表名的最后一部分(在 mysql 扩展中运行良好的进程。这是该代码;
function db_connect($add) {
$db=NULL;
$db_host="localhost";
$db_username='root';
$db_pass='';
$db_name='host_base_name_'.$add;
try{
$db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(PDOException $e){echo $e->getMessage();}
return $db;
}
在第二次调用(更改数据库)后,我的下一个查询产生了一个找不到表的错误 - 并将表引用的“host_base_name_”部分作为原始引用。我认为 NULL 调用会破坏实例。
如果我把 $db=NULL;在调用脚本中,就在函数之前,我收到“调用非对象上的成员函数查询()”尖叫错误。
为什么一个工作而不是另一个工作,因为它们看起来相同,我该如何解决这个问题?
【问题讨论】:
标签: php mysql database pdo connection