1

これまで使用してきPDO->bindParamましたが、マニュアルを読んでいるうちに、値でパスするのがわかりPDO->bindValueますが、参照でパスするのはこれだけですか?PDO->bindValuePDO->bindParam

$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");

while(something)
{
        $modThread->bindParam(':id', $thread);
        $modThread->execute();
//*******************HERE********************//
}

再び私が見つけたマニュアルを読んでいる間:PDO->closeCursor私はそれをマークされた場所に置くべきですか?オプション/自動的に呼び出されますか?特定のドライバーだけがそれを必要としているようです。それを必要としない/サポートしていないドライバーでそれを呼び出すと、エラーが発生しますか?MySQLはどうですか?

4

2 に答える 2

5

これは真実ではありません。closeCursorを使用する必要がある場合は、挿入/更新/削除コマンドを使用するのが最適な時間の1つであり、結果を既にフェッチしているSELECTステートメントを使用することはめったにありません。

たとえば、テーブルからすべてのレコードを選択してから$ stmt-> fetch()を発行すると、行がフェッチされていない状態ではなくなるため、これによりcloseCursorの目標がすぐに達成されます。

マニュアルから:

このメソッドは、以前に実行されたPDOStatementオブジェクトにまだフェッチされていない行がある場合に、PDOStatementオブジェクトの実行をサポートしないデータベースドライバーに役立ちます。データベースドライバにこの制限がある場合、問題は順不同のエラーとして現れる可能性があります。

closeCursorが本当に必要になるのは、次のいずれかの場合です。

  • フェッチされていない行が前の実行から利用可能であるのに、DBドライバーが新しいstmtの実行を許可しない場合
  • 複数のプリペアドステートメントがあり、それらを次々に実行したい($ stmt1-> execute(); $ stmt-> closeCursor(); $ stmt2-> execute(); $ stmt2-> closeCursor(); $ stmt3 ... etc)
  • 同じブロック内で挿入/更新/削除を実行する必要がある複数のstmtがあります。これは、mysql行の結果を取得しない一方で、影響を受ける行の数の結果セットを取得するためです(これはまだ結果です)。
  • トランザクションを使用する場合
  • selectスタイルのプリペアドステートメントを発行して実行したいが、後でデータを取得したくない場合

closeCursorステートメントが必要ない場合:

  • 次のステートメントが実行される前に($ stmt-> fetch()のように)すでに行をフェッチしている場合。この時点で、行は「フェッチ済み」状態になり、ドライバーを解放して新しいステートメントを実行します。

カーソルを閉じるのに役立つのは、unset()(つまり、unset($ stmt))で、ステートメントをnull($ stmt = null)に設定し、組み込みのガベージコレクターのドアを開いてすべてをクリアすることです。

詳細については、マニュアルを参照してください:http: //php.net/manual/en/pdostatement.closecursor.php

于 2011-11-10T23:45:48.813 に答える
1

ここでの「繰り返し」bindParam()は実際には必要ありません。

$thread = 0;
$modThread->bindParam(':id', $thread);

while($thread < 20)
{
    $thread++;
    $modThread->execute(); //executing with the new value, which you couldn't do with bindValue
}

closeCursor()結果セットがない場合(つまり、sまたはプロシージャが結果を返す場合のみ)は必要ありませんがSELECT、通常、前のステートメント/行のどこかでfetchAllを実行しました。

于 2010-09-16T10:17:20.037 に答える