<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->エラーは問題を見つけるのに十分ではないことがよくあります。この時点で、 $ 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>開発環境で有効になります<br> 詳細なエラー情報の出力を開発またはデバッグモードでのみ使用して、データベース構造の漏れや生産環境での機密情報を避けない
ロギングと組み合わせて<br> $ stmt-> error_list出力を記述してファイルをログにして、後続の分析と問題のトレースバックを簡単にします
SQLSTATE比較テーブル<br>と協力してください SQLSTATEコードに従って問題の種類をすばやく見つけます(同期エラー、許可不足、接続の中断など)
従来の$ stmt->エラーと比較して、 mysqli_stmt :: $ error_listは、特に複雑なクエリとプリプロシングステートメントをデバッグする場合、問題のあるポジショニング効率を大幅に改善できる場合に、より豊富なエラーの詳細を提供できます。それを正しく使用すると、SQLの構文エラーと実行の問題をより速く、より正確に解決することができます。
<span></span>
関連タグ:
mysqli_stmt MySQL