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

スクリプトの実行を終了する場合は、dieまたはexitを使用して、オプションのエラー メッセージをユーザーに表示できます。

PDOマニュアルによると:

接続を閉じるには、オブジェクトへの残りのすべての参照が削除されるようにして、オブジェクトを破棄する必要があります。これは、オブジェクトを保持する変数に 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あり、それも破棄されます。基本的に、スクリプトの終了時以外に PDO オブジェクト ( mysqli_closeなど) の接続を閉じる真の方法はありません。これは、オブジェクトを「切断」状態に設定する方法がないため、オブジェクトのコピーが接続されたままになるためです。

私の経験では、とにかくデータベース接続を明示的に閉じる必要があることはめったにないので、心配する必要はほとんどありません。

于 2013-08-03T01:22:27.427 に答える
1

この方法で PDO 接続を閉じても問題ありません。「機能しない」とはどういう意味かをもっと明確に説明する必要があります。

$dbh を null に設定していると思いますが、その後のコード行でそれを使用しようとしています。

これを確認するために、PDO オブジェクトを期待するクラスが null ではなく PDO オブジェクトを取得するようにします。たとえば、型ヒントを使用します。

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
于 2013-08-03T00:21:41.983 に答える