<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// この記事は、デモンストレーションのみを目のとしています,次のコードはテキストとは何の関係もありません。</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"test"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_errno) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続に失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
<h1>避ける“無効な前処理ステートメント”間違い:mysqli_stmt::</span><span><span class="hljs-variable constant_">next_result</span></span><span> 使用する際の一般のな落とし穴とソリューション</h1>
<p>
使用中 PHP の <code>mysqliまたは同様のヒント:無効な準備されたステートメント。これらの問題のほとんどは、 mysqli_stmt :: next_result()の不適切な使用に関連しています。
複数のSQLを使用したストアドプロシージアまたはクエリが実行されると、MySQLは複数の結果セットを返します。 PReprocessingステートメントオブジェクトMySqli_Stmtは、デフォルトで設定された結果を1つだけ処理できます。前の結果セットが完全に消費されていない場合(たとえば、 STMT-> fetch()がきれいに読むために呼び出されません)、 next_result()を呼び出し続けると、「無効な前処理ステートメント」エラーが発生する可能性があります。
2つの主なソリューションがあります。結果セットの完全な消費を確保し、リソースのリリースを確保することです。
$stmt = $mysqli->prepare("CALL my_stored_procedure()");
$stmt->execute();
do {
$result = $stmt->get_result();
if ($result) {
while ($row = $result->fetch_assoc()) {
// 処理結果
}
$result->free();
}
} while ($stmt->more_results() && $stmt->next_result());
上記のコードでは、 do ... loopは、次の結果セットを入力する前に、各結果セットがトラバースされてリリースされることを保証します。これは間違いを避けるための鍵です。
「無効な前処理ステートメント」エラーは、本質的に不適切な結果セット管理によって引き起こされます。 mysqli_stmt :: next_resultの作業メカニズムを理解し、コード内のすべての結果セットを明示的に扱うことは、そのようなエラーを回避するための基本的なソリューションです。これらのスキルを習得した後、アプリケーションの安定性を改善するだけでなく、データベースの相互作用の隠されたバグを減らすこともできます。
関連タグ:
mysqli_stmt