<span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
In real-world development, we often encounter MySQL query execution failures, especially when using Prepared Statements. Although mysqli provides error and errno properties to get error information, they usually return only one error. For more detailed and structured error information, mysqli_stmt::$error_list is a very useful tool.
<hr>
<p>*/</span></p>
<p></span># Practical tips for debugging MySQL query syntax errors using mysqli_stmt::$error_list<span></p>
<p>When using PHP's mysqli extension for database operations, the <code>mysqli_stmt::</span><span><span class="hljs-variable">$error_list</span></span><span>
During debugging, especially when SQL statements are long or involve multiple parameter bindings, a single $stmt->error is often insufficient to pinpoint issues. In such cases, we can iterate through $stmt->error_list to view all errors at once.
Example code:
<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">// Intentionally passing a wrong type</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>
Enable in Development Environment
Use detailed error output only in development or debugging mode to avoid exposing database structure or sensitive information in production.
Combine with Logging
Write $stmt->error_list output to log files for later analysis and troubleshooting.
Use with SQLSTATE Reference
Quickly identify issue types (syntax errors, permission issues, connection interruptions, etc.) based on SQLSTATE codes.
mysqli_stmt::$error_list provides richer error details compared to the traditional $stmt->error. It significantly improves troubleshooting efficiency for complex queries and prepared statements. Using it correctly helps resolve SQL syntax errors and execution issues more quickly and accurately.
<span></span>
Related Tags:
mysqli_stmt MySQL