pdo-> bindparam、pdo-> bindvalueおよびpdo-> closecursor
質問
これまでのところ、私は使用しています 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