php PDO 在脚本期间通过函数更改连接

标签 php mysql database pdo connection

我有一个应用程序,出于客户端保护和使用核心数据库进行归档的原因,必须使用多个数据库(例如用户详细信息存储)。我很高兴需要从 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/

相关文章:

php - 如何在变量中获取行并用逗号分隔值?

mysql - 计算 mySQL 列中某些数据的实例数

php - MySQL 插入错误与 PHP

mysql - 如何编写有效的 "SELECT a FROM t WHERE b IN() ORDER BY a"查询?

SQLite where 子句对 TEXT 字段表现奇怪

php - 如何使用 php 管理同一主机上两个不同网站的单独 session 状态

php - 通过附加信息在 SplObjectStorage 中查找对象

java - 如何与 Hibernate 实现 3 多对多关系?

PHP echo html 表格错误

php - 允许用户编辑 php 代码并安全地提交结果