質問

これまでのところ、私は使用しています PDO->bindParam しかし、マニュアルを読んでいる間、私は見つけました PDO->bindValue 私が伝えることができることから PDO->bindValue As PDO->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はどうですか?

役に立ちましたか?

解決

「繰り返し」 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() 結果がない場合(つまり、 SELECT sまたは手順は結果を返します)が、通常、私はすでに以前のステートメント /行のどこかでフェッチを行っています。

他のヒント

これは真実ではありません。 CloseCursorを使用する必要があることに気付いた場合、最も最適な時間の1つは、挿入/更新/削除コマンドのためであり、既に結果を取得している選択されたステートメントの場合はめったにありません。

たとえば、テーブルからすべてのレコードを選択してから$ stmt-> fetch()を発行する場合、これは実際にclosecursorの目標を達成します。

マニュアルから:

この方法は、以前に実行されたpdostatementオブジェクトにまだ解除された行がある場合、pdostatementオブジェクトの実行をサポートしないデータベースドライバーに役立ちます。データベースドライバーがこの制限に苦しんでいる場合、問題はシーケンス外エラーで現れる可能性があります。

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

  • DBドライバーが以前の実行から利用可能になっている間に新しいSTMTを実行することを許可していない場合
  • 複数の準備されたステートメントがあり、1つの別のステートメントを実行したい($ stmt1-> execute(); $ stmt-> closecursor(); $ stmt2-> execute(); $ stmt2-> closecursor(); $ stmt3 ...など)
  • 同じブロック内で挿入/更新/削除を実行する必要がある複数のSTMTがあります。これは真実です。なぜなら、MySQLの行の結果を取得しないでください。
  • トランザクションを使用する場合
  • 選択したスタイルの作成されたステートメントを発行して実行する場合は、後でデータを取得しない場合

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top