在使用PDO时重用变量

问题描述

| 我必须从至少3个数据库中提取数据,重用PDO对象有什么问题吗?
$dbh = new PDO(\'mysql:host=\' . $host . \';dbname=\' . $db_name,$user,$password);
$sth = $dbh->prepare($query1);

// do something

$dbh = new PDO(\'mysql:host=\' . $host2 . \';dbname=\' . $db_name2,$user2,$password2);
$sth = $dbh->prepare($query2);

//do something else
很抱歉编辑,但这是另一个考虑因素。我显然应该使用所有这些检查连接是否成功,如果连接失败,则抛出异常:
if (!$dbh) {
    $err=$dbh->errorInfo();
    throw new Exception(\'Could not connect: \' . $err[2]);
}
我不认为有办法避免这种情况,除非我同时创建所有连接并执行
if (!dbh1|!dbh2) { ... }
。只是要考虑的其他事情。     

解决方法

        当您将
$dbh
分配给
new PDO()
时,从技术上讲,您并不是在重用pdo对象。您正在创建一个新的PDO实例,并将其分配给您先前使用的变量。只要您了解程序中正在发生的事情,这样做就没有错。 编辑: 我正在编辑我的答案,以解决您在上一个问题中添加的新问题。   我显然应该使用所有这些检查连接是否成功,如果连接失败,则抛出异常: 您可以在尝试捕获中加入连接尝试,这是处理连接错误的典型策略:
<?php
    try {
        $dbh = new PDO(\'mysql:host=localhost;dbname=databaseName\',$userName,$password);

        foreach($dbh->query(\'SELECT * from TableName\') as $row) {
            print_r($row);
        }

        $dbh = null;
    } catch (PDOException $ex) {
        print \"Error!: \" . $ex->getMessage() . \"<br />\";
        die();
    }
?>
    ,        您可以这样做,但是...不行。使用另一个变量名(它们很便宜),它将使您的代码更易于理解。你甚至可以(应该)使用变量名来提示您对象所连接的数据库,即:
// connection to data warehouse
$dbh_dataWH = new PDO(\'mysql:host=\' . $host . \';dbname=\' . $db_name,$user,$password);
// connection to crm 
$dbh_crm = new PDO(\'mysql:host=\' . $host2 . \';dbname=\' . $db_name2,$user2,$password2);
这样,您将能够重用连接对象,而我谦虚地认为,对于您或需要维护它的任何人,代码都将更加清晰。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...