私はPDOStatement(; )でMysqlベースのPDO接続を利用しており、メソッドで利用する以前の開発者からのコードを実行しました。::prepare()
::execute()
PDOStatement::closeCursor()
とにかく、ステートメントは関数の最後で設定されていません。
public function fooBar($identifier)
{
...
/** @var $dbc PDO */
$dbc = $conn->getConnection();
$stmt = $dbc->prepare('SELECT orderType, orderComment, payload FROM cart WHERE identifier = :identifier');
$stmt->execute(array('identifier' => $identifier));
$stmt->setFetchMode(PDO::FETCH_OBJ);
$cart = $stmt->fetch();
$stmt->closeCursor();
...
return $result;
}
私のメンタルモデルでは、このハウスキーピング(カプセル化の基本)を処理するオブジェクトを実行するため、とにかくここでPDOStatementがクリアされていると言えます。したがってPDOStatement::closeCursor()
、特に、これがここで必要なものと正確に一致しない可能性があるため、呼び出しは私には不必要に見えます。ステートメントは再利用されないため、カーソルを閉じる必要はまったくありません。
補足:このコードは例示的なものであり、実際のコードでは
$stmt->execute(...)
、行数が1でない場合、後にスローされる例外もあります。
チャールズは 2011年5月に質問pdo無料の結果でコメントしました:
一部のドライバーだけでなく、ドライバーによって提供される一部の設定では、MySQLをオフにするなど、別のクエリを実行する前に結果セットを閉じる必要があります
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
。ありがたいことに、電話をかけることができcloseCursor
、アクションを実行する必要がない場合は何も正常に実行されません。それ以外の場合は、ステートメントハンドルを含む変数の設定を解除するだけでクリーンアップされます。
別の質問PDOステートメントにcloseCursor()を使用する必要があるのはいつですか?それはすべて希望に満ちているので、私が不思議に思っていない受け入れられた答えはありません。
で再利用PDOステートメントvarはプロセスがクラッシュしている作られたコメント変数を設定解除する方法のうち、すべてのエラー(メモリ破損のバグ)を取得しないことは:
[...]ステートメントvarを再割り当てする前に設定を解除しようとしましたが、役に立ちませんでした。[...]
ただし、スコープがなくなるローカル変数にもこれが当てはまるかどうかはわかりません。私もmod_php
SAPIとしては使用していません。
pdo_mysql_stmt_dtor()
と同じクリーンアップ操作をpdo_mysql_stmt_cursor_closer()
実行します。ステートメントオブジェクトが明示的に設定解除されているか、スコープ外にある限り、操作は常に実行されます。
したがってcloseCursor()
、ステートメントがとにかく破棄されようとしている場合は、厳密に呼び出す必要はありません。個人的には読みやすさを明示したいのでとにかくやりますが、それは個人的なスタイルの好みに帰着します。
上記の文献に基づいて、これができるだけPDO_MYSQLに関する特定のために言うこと-他のドライバーのために、これは当てはまらないかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加