问题描述
|
我必须从至少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);
这样,您将能够重用连接对象,而我谦虚地认为,对于您或需要维护它的任何人,代码都将更加清晰。