【问题标题】:php PDO change connection during script via functionphp PDO在脚本期间通过函数更改连接
【发布时间】: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


    【解决方案1】:

    每个数据库都有单独的 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);
    

    【讨论】:

    • 我可以看到您来自哪里,但问题似乎是我通过函数调用它。我更改为一个简单的包含,删除了函数包装器,并且数据库更改工作得很好。我可能会通过课程看看这是否会更好,但我只是开始走 OOP 路线。
    • 我不是 OOP 专家,但我认为不可能使用 classes.ie 2 of function __construct($pdo) { $this-&gt;dbh = $pdo; }
    【解决方案2】:

    对于那些将来遇到这种情况的人,我发现我确实可以用一个类替换函数调用并创建一个到不同数据库的新连接。在此过程中,我发现通过将 'localhost' 替换为 '127.0.0.1' 可以显着提高速度 - 将测试脚本的执行时间从 0.0060 秒减半到 0.0029,这在复杂脚本中非常重要。

    所以这是我的课程 - 因为它无论如何都包含在脚本的顶部,所以我将主要连接参数放在包含的头部,以便它们可以在课程中使用。 $db_name 在脚本中被修改,因此它引用了正确的数据库。

    $db_host='127.0.0.1';
    $db_user='root';
    $db_pass='';
    $db_name='host_base_name'; 
    class databaseConnect{
      public function connect($db_host, $db_user,$db_pass,$db_name){
        try{
          $db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_user,$db_pass, array(PDO::ATTR_PERSISTENT=>false));
          $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
           }
        catch(PDOException $e){echo "Error: ".$e->getMessage()."<br />"; die(); }
        return $db;
       }
    }
    

    我得到了新的数据库连接实例(在本例中为“host_base_nametest”,使用下面的代码,当我必须切换数据库时,我将 $con 替换为另一个变量,本质上为我在连接中提供了完全灵活且可传输的数据库命名:

    $add='test';   // in production this comes from another variable 
    $db_inst=$db_name.$add; //builds the database name 
    $con=new databaseConnect;   //calls the class
    $db=$con->connect($db_host, $db_user,$db_pass,$db_inst);  //gets the new instance
    

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多