<span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
在實際開發中,我們經常會遇到 MySQL 查詢執行失敗的情況,尤其是在使用預處理語句(Prepared Statements)時。雖然 mysqli 提供了 error 和 errno 屬性來獲取錯誤信息,但這些通常只會返回一個錯誤。如果想獲取更詳細、結構化的錯誤信息,mysqli_stmt::$error_list 就是一個非常有用的工具。
------------------------------------------------------------
*/</span>
</span><span><span class="hljs-comment"># 使用 mysqli_stmt::$error_list 進行 MySQL 查詢語法錯誤調試的實用技巧是什麼?</span></span><span>
在使用 PHP 的 mysqli 扩展進行数据库操作時,`mysqli_stmt::</span><span><span class="hljs-variable">$error_list</span></span><span>` 屬性能夠為開發者提供一個包含所有錯誤信息的數組。這在調試複雜 SQL 查询時尤其有帮助,因為它不僅包含第一個錯誤,還會列出執行過程中出現的所有錯誤細節。
</span><span><span class="hljs-comment">### 1. `mysqli_stmt::$error_list` 的返回結構</span></span><span>
`</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list` 會返回一個數組,其中的每個元素都是一個關聯數組,包含以下鍵值:
- **errno**:錯誤代碼
- **sqlstate**:SQLSTATE 标准化錯誤代碼
- **error**:錯誤的詳細描述
示例返回值:
```php
[
[
</span><span><span class="hljs-string">"errno"</span></span><span> => </span><span><span class="hljs-number">1064</span></span><span>,
</span><span><span class="hljs-string">"sqlstate"</span></span><span> => </span><span><span class="hljs-string">"42000"</span></span><span>,
</span><span><span class="hljs-string">"error"</span></span><span> => </span><span><span class="hljs-string">"You have an error in your SQL syntax; ..."</span></span><span>
]
]
</span></span>
在调试过程中,尤其是 SQL 语句较长或涉及多个参数绑定时,单一的 $stmt->error 往往不足以定位问题。这时,我们可以遍历 $stmt->error_list 来一次性查看所有错误信息。
示例代码:
<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">"pass"</span></span><span>, </span><span><span class="hljs-string">"test"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Prepare failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error);
}
</span><span><span class="hljs-variable">$id</span></span><span> = </span><span><span class="hljs-string">"abc"</span></span><span>; </span><span><span class="hljs-comment">// 有意傳入錯誤類型</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$err</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error Code: <span class="hljs-subst">{$err['errno']}</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"SQLSTATE: <span class="hljs-subst">{$err['sqlstate']}</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Message: <span class="hljs-subst">{$err['error']}</span></span></span><span>\n\n";
}
}
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
在开发环境启用
仅在开发或调试模式下使用详细的错误信息输出,避免在生产环境泄露数据库结构或敏感信息。
结合日志记录
将 $stmt->error_list 输出写入日志文件,方便后续分析和问题回溯。
与 SQLSTATE 对照表配合
根据 SQLSTATE 码快速定位问题类型(语法错误、权限不足、连接中断等)。
mysqli_stmt::$error_list 相比传统的 $stmt->error,能提供更加丰富的错误细节,特别是在调试复杂查询和预处理语句时,可以显著提高问题定位效率。正确地使用它,可以帮助我们更快、更准确地解决 SQL 语法错误与执行问题。
<span></span>
相關標籤:
mysqli_stmt MySQL