我有一个应用程序,出于客户端保护和使用核心数据库进行归档的原因,必须使用多个数据库(例如用户详细信息存储)。我很高兴需要从 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();}
这成功地完成了切换 - 我尝试了三个数据库,但没有显示第三个数据库的经济性。
但是,在开发代码中,我的脚本有一个“require”文件,其中包含处理连接的函数。它通过调用发送表名的最后一部分(这个过程在 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;在调用脚本中,就在函数之前,我收到“在非对象上调用成员函数 query()”尖叫错误。
为什么一个有效而另一个无效,因为它们看起来相同,我该如何解决这个问题?
最佳答案
每个数据库都有单独的 PDO
$db_host="localhost";
$db_username='root';
$db_pass='';
$add='admin';
$db_name1='host_base_name'.$add1;One database
$db_name2='host_base_name'.$add2;Other database
try{
//PDO for one database
$db1= new PDO('mysql:host='.$db_host.';dbname='.$db_name1,$db_username,$db_pass);
$db1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//PDO for other database
$db2= new PDO('mysql:host='.$db_host.';dbname='.$db_name1,$db_username,$db_pass);
$db2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
关于php PDO 在脚本期间通过函数更改连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752005/