2011-11-28 17 views
7

私は準備された文を書くために私のPHPスクリプト内で同じ変数$stmtを再利用されています:Prepared Statementがキャッシュされているかどうかはどのようにわかりますか?

$stmt = $dbh->prepare("SELECT column_A FROM Table1 WHERE id=?"); 
$stmt->bindValue(1, $id, PDO::PARAM_INT); 
$stmt->execute(); 
.... 

$stmt = $dbh->prepare("UPDATE Table2 SET column_B=? WHERE column_A=?"); 
$stmt->bindValue(1, $name); 
$stmt->bindValue(2, $column_A); 
$stmt->execute(); 

私の質問があり、二つの文はキャッシュとするために書かれている場合、私は知っていますか2番目のステートメントはなかったこと両方のステートメントが同じ変数名を共有していますが、最初のステートメントを上書きしますか?

+0

私に何か新しいことを教えてくれる –

答えて

2

書を参照して、データベースエンジンではなくPHPによって製造される:

だから、PHPで同じ変数名を再利用すると、MySQLは「キャッシュ」を用意無効にしません。

+1

'setAttribute(PDO :: ATTR_EMULATE_PREPARES、false)'または真と偽の両方のケースに適用できる場合にのみ適用できますか? –

+0

リンクに「指定された名前のプリペアドステートメントがすでに存在する場合は、新しいステートメントが準備される前に暗黙的に割り当てが解除されます。 'stmt_name'がMySQLによって割り当てられ、PHPの変数名から引き出されていないかどうかを知るには? –

+0

@BenHuh:正直言って、私は分かりません。私の推測では、 'stmt_name'はPHPがSQLクエリ自体から計算した何らかのハッシュです。私はMySQLのドキュメントとPDO/mysqlのソースコードを簡単に見て、いずれの方向も指し示すものは見つけられませんでしたが、MySQLのログが役立つ情報を提供すると思います。 –

0

あなたはしていません。しかし、変数をオーバーライドすることはあまり変わらないでしょう - あなたは変数に新しい値を割り当てて、何も編集しません。

関連する問題