K我正在将PDO连接传递给类构造函数以获取一些sql信息。当我不用NULL手动关闭PDO时,它完美地工作。
try
{
$dbh = new PDO('mysql:host=localhost;dbname=test');
}
catch(PDOException $ex)
{
echo "Failed to connect to the database: " . $ex->getMessage();
}
$objGetReference = new getReference($dbh);
$reference=$objGetReference->getReference();
然而,当我有一个$ dbh = null的完全相同的代码时;最后关闭pdo对象失败了。所以以下内容不起作用:
try
{
$dbh = new PDO('mysql:host=localhost;dbname=test');
}
catch(PDOException $ex)
{
echo "Failed to connect to the database: " . $ex->getMessage();
}
$objGetReference = new getReference($dbh);
$reference=$objGetReference->getReference();
$dbh=NULL;
我知道php脚本无论如何都会终止它,但我想这样结束它。只是好习惯。
如何提前关闭数据库连接?
此外,如果我将它传递给多个类,我应该在每个使用它的类中单独关闭它吗?
谢谢大家。
答案 0 :(得分:1)
以这种方式关闭PDO连接应该没问题。您应该更清楚地描述“不起作用”的含义。
我猜你将$ dbh设置为null,但后来尝试在后续的代码行中使用它。
要确认这一点,我会确保我的类期望PDO对象得到一个而不是null。例如,使用类型提示:
class getReference {
public function __construct(PDO $dbh) {
...
}
}
这很容易做到,如果您不小心传递了null,应该使构造函数抛出致命错误。
$dbh = null
$r = new getReference($dbh);
这是错误:
Catchable fatal error: Argument 1 passed to getReference::__construct()
must be an instance of PDO, null given
答案 1 :(得分:1)
如果要终止脚本的执行,可以使用die或exit以及将向用户显示的可选错误消息。
根据PDO manual:
要关闭连接,您需要通过确保来销毁对象 删除所有剩余的引用 - 你这样做 将NULL分配给包含对象的变量
措辞有点不对(至少对我而言),因为你不仅需要销毁所有引用,而且还需要销毁所有副本。
例如:
$a = new PDO( [args] );
$b = $a;
$a = null;
然后$b
仍然连接到数据库,所以你必须确保你也销毁它。将它用作方法/函数的参数也是如此,因为这会创建原始对象的副本而不是引用(除非通过引用传递):
function killDbh($dbh) {
$dbh = null;
}
killDbh($dbh);
echo get_class($dbh); // echoes PDO
要关闭连接,您需要关闭所有连接,包括任何对象。但是,如果你这样做,
$a = new PDO( [args] );
$b =& $a;
$a = null;
然后$b
是$a
的引用,它也将被销毁。本质上,除了脚本终止之外,没有 true 方法来关闭PDO对象的连接(如mysqli_close),因为没有办法将对象设置为“断开连接”状态,所以对象的任何副本仍然是连接的。
根据我的经验,无论如何都很少需要显式关闭数据库连接,所以你几乎不用担心。