0

KI 将 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 脚本在完成后无论如何都会杀死它,但我想像这样结束它。只是好习惯。

如何提前关闭数据库连接?

另外,如果我将它传递给多个类,是否应该在每个使用它的类中单独关闭它?

谢谢大家。

4

2 回答 2

1

以这种方式关闭 PDO 连接应该没问题。您应该更清楚地描述“不起作用”的含义。

我猜您将 $dbh 设置为 null,然后尝试在后续代码行中使用它。

为了确认这一点,我将确保我的期望 PDO 对象的类得到一个而不是 null。例如,使用类型提示

class getReference {
  public function __construct(PDO $dbh) {
    ...
  }
}

这很容易做到,如果你不小心传递了一个空值,应该会让构造函数抛出一个致命错误。

$dbh = null
$r = new getReference($dbh);

这是错误:

Catchable fatal error: Argument 1 passed to getReference::__construct() 
must be an instance of PDO, null given
于 2013-08-03T00:21:41.983 回答
1

如果要终止脚本的执行,可以使用dieexit并带有可选的错误消息,该消息将显示给用户。

根据PDO 手册

要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象 - 您可以通过将 NULL 分配给保存该对象的变量来做到这一点

它的措辞有点错误(至少对我而言),因为您不仅需要销毁所有引用,而且还需要销毁所有副本。

例如:

$a = new PDO( [args] );
$b = $a;
$a = null;

然后$b仍然连接到数据库,因此您必须确保也将其销毁。将其用作方法/函数的参数也是如此,因为这会创建原始对象的副本而不是引用(除非通过引用传递):

function killDbh($dbh) {
    $dbh = null;
}
killDbh($dbh);
echo get_class($dbh); // echoes PDO

为了关闭连接,您需要关闭所有连接,包括任何 in 对象。然而,如果你这样做,

$a = new PDO( [args] );
$b =& $a;
$a = null;

然后$b是一个引用,$a它也将被销毁。本质上,除了脚本终止之外,没有真正的方法可以关闭 PDO 对象(如mysqli_close)的连接,因为无法将对象设置为“断开连接”状态,因此对象的任何副本仍然是连接的。

根据我的经验,很少需要显式关闭数据库连接,因此您无需担心。

于 2013-08-03T01:22:27.427 回答