<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或者類似提示: Invalid prepared statement 。這些問題大多與mysqli_stmt::next_result()的使用不當有關。
當執行存儲過程或帶有多條SQL 的查詢時,MySQL 會返回多個結果集。預處理語句對象mysqli_stmt默認只能處理一個結果集,如果前一個結果集沒有被完全消費掉(例如未調用stmt->fetch()讀取乾淨),那麼繼續調用next_result()時就可能導致“無效的預處理語句” 錯誤。
解決思路主要有兩點:保證結果集完整消費、確保資源釋放。
$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...while循環確保每個結果集都被遍歷並釋放,隨後才進入下一個結果集。這是避免錯誤的關鍵。
“無效的預處理語句” 錯誤本質上是由於結果集管理不當造成的。理解mysqli_stmt::next_result的工作機制,並在代碼中明確處理所有結果集,是避免此類錯誤的根本解決之道。掌握這些技巧後,不僅能提升應用穩定性,也能減少數據庫交互中的隱性bug。
相關標籤:
mysqli_stmt