現在の位置: ホーム> 最新記事一覧> mysqli_stmt :: $ error_listを使用して、mysqlクエリの構文エラーをデバッグするための実用的なヒントは何ですか?

mysqli_stmt :: $ error_listを使用して、mysqlクエリの構文エラーをデバッグするための実用的なヒントは何ですか?

gitbox 2025-09-17
<span><span><span class="hljs-meta">&lt;?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>-&gt;error_list` 配列が返されます,其中の每个元素都是一个关联数组,次のキー値が含まれています:
- **errno**:エラーコード
- **sqlstate**:SQLSTATE 标准化エラーコード
- **error**:错误の详细描述

例の返品値:
```php
[
    [
        </span><span><span class="hljs-string">"errno"</span></span><span> =&gt; </span><span><span class="hljs-number">1064</span></span><span>,
        </span><span><span class="hljs-string">"sqlstate"</span></span><span> =&gt; </span><span><span class="hljs-string">"42000"</span></span><span>,
        </span><span><span class="hljs-string">"error"</span></span><span> =&gt; </span><span><span class="hljs-string">"You have an error in your SQL syntax; ..."</span></span><span>
    ]
]
</span></span>

2。典型的な使用シナリオ

特に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>-&gt;</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>-&gt;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>-&gt;</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>-&gt;</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>-&gt;error_list) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;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>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

3。デバッグの提案

  1. 開発環境で有効になります<br> 詳細なエラー情報の出力を開発またはデバッグモードでのみ使用して、データベース構造の漏れや生産環境での機密情報を避けない

  2. ロギングと組み合わせて<br> $ stmt-> error_list出力を記述してファイルをログにして、後続の分析と問題のトレースバックを簡単にします

  3. SQLSTATE比較テーブル<br>と協力してください SQLSTATEコードに従って問題の種類をすばやく見つけます(同期エラー、許可不足、接続の中断など)

4。概要

従来の$ stmt->エラーと比較して、 mysqli_stmt :: $ error_listは、特に複雑なクエリとプリプロシングステートメントをデバッグする場合、問題のあるポジショニング効率を大幅に改善できる場合に、より豊富なエラーの詳細を提供できます。それを正しく使用すると、SQLの構文エラーと実行の問題をより速く、より正確に解決することができます。

 <span></span>