現在の位置: ホーム> 最新記事一覧> mysqli_stmt :: $ error_listの複数のエラーをどのように効果的に扱う必要がありますか?

mysqli_stmt :: $ error_listの複数のエラーをどのように効果的に扱う必要がありますか?

gitbox 2025-08-22

mysqli_stmt :: $ error_listは、 phpのmysqli拡張機能を使用して準備されたステートメントを実行する際に非常に重要なデバッグツールです。 $ stmt->エラーのような最後のエラーを返すだけでなく、すべてのエラーメッセージを備えた配列を提供します。このプロパティは、1回の実行または準備中に複数のエラーが同時にトリガーされる場合に特に重要です。

ただし、開発者が$ stmt-> error_listで返された複数のエラーに直面した場合、それらはしばしば混乱します。これらのエラー情報をどのように効果的に抽出、処理、表示する必要があります。

この記事では、次の側面からの複数のエラー処理の戦略について説明します。

1。error_listの構造を理解します

$ stmt-> error_list配列を返します。各要素は、次のキーを含む連想配列です。

  • errno :エラーコード(整数)

  • SQLSTATE :SQLSTATEエラー識別子(文字列)

  • エラー:エラーメッセージ(文字列)

典型的な構造は次のとおりです。

 <span><span>[
    [
        </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; check the manual...'</span></span><span>
    ],
    [
        </span><span><span class="hljs-string">'errno'</span></span><span> =&gt; </span><span><span class="hljs-number">1048</span></span><span>,
        </span><span><span class="hljs-string">'sqlstate'</span></span><span> =&gt; </span><span><span class="hljs-string">'23000'</span></span><span>,
        </span><span><span class="hljs-string">'error'</span></span><span> =&gt; </span><span><span class="hljs-string">'Column \'name\' cannot be null'</span></span><span>
    ]
]
</span></span>

これは、エラーが1つしかないと仮定するのではなく、各エラーを個別に判断および処理する必要があることを意味します。

2。統一されたカプセル化エラー出力ロジック

各SQL実行で処理ロジックを繰り返し回避するには、エラー処理を関数にカプセル化することをお勧めします。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>) {
    </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">$error</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"[SQL Error] Code: <span class="hljs-subst">{$error['errno']}</span></span></span><span> | SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span> | Message: </span><span><span class="hljs-subst">{$error['error']}</span></span><span>");
    }
}
</span></span>

これにより、execute()またはprepare() failを毎回呼び出すことができます。

 <span><span><span class="hljs-keyword">if</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-title function_ invoke__">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>);
}
</span></span>

3。重大度による誤分類

すべての間違いが同様に重要であるわけではありません。次のような、 Errnoに従って分類することをお勧めします。

  • 論理エラー(空のデータ、一意の重要な競合など) :ユーザーへのフィードバック、またはビジネスの例外として記録することができます。

  • 構文エラーまたはデータベースの障害(SQLスペルエラー、接続の欠落など) :リクエストはすぐに呼び出されるか、中止する必要があります。

単純なマッピングテーブルを使用して、重大度を決定できます。

 <span><span><span class="hljs-variable">$criticalErrors</span></span><span> = [</span><span><span class="hljs-number">1064</span></span><span>, </span><span><span class="hljs-number">2006</span></span><span>, </span><span><span class="hljs-number">2013</span></span><span>];

</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">$error</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$error</span></span><span>[</span><span><span class="hljs-string">'errno'</span></span><span>], </span><span><span class="hljs-variable">$criticalErrors</span></span><span>)) {
        </span><span><span class="hljs-title function_ invoke__">trigger_error</span></span><span>(</span><span><span class="hljs-string">"深刻なデータベースエラー: <span class="hljs-subst">{$error['error']}</span></span></span><span>", E_USER_ERROR);
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"通常のエラー: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
    }
}
</span></span>

4. prepare()エラーの欠落を避けてください

開発者が無視できることの1つは、prepare()の障害も複数のエラーを生成できることです。 falseの返品値では判断することはできません。また、 error_listを呼び出す必要があります:

 <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-variable">$sql</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">foreach</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Prepare Error: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
    }
}
</span></span>

5.開発環境での詳細なロギングを有効にします

開発フェーズでは、ブラウザまたは開発コンソールにエラーログを出力することをお勧めしますが、生産環境では、表示せずにログのみを記録する必要があります。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">log_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>, </span><span><span class="hljs-variable">$display</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>) {
    </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">$error</span></span><span>) {
        </span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"[Error <span class="hljs-subst">{$error['errno']}</span></span></span><span>] </span><span><span class="hljs-subst">{$error['error']}</span></span><span> (SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span>)";
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>);
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$display</span></span><span>) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;div class=\"sql-error\"&gt;<span class="hljs-subst">$message</span></span></span><span>&lt;/div&gt;";
        }
    }
}
</span></span>

6。結論

mysqli_stmt :: $ error_listは、控えめだが強力なエラートラブルシューティングツールです。複雑なSQL操作を実行したり、多数のパラメーターをバインドしたり、複数のデータテーブルを接続したりすると、多くの場合、複数のエラーがあります。これらのエラーを正しく解析して分類することで、バグをすばやく修正するだけでなく、システムの堅牢性を改善します。

$ stmt-> error -master error_listを完全に見るのを停止すると、デバッグSQLが効率を複数に改善できることがわかります。