mysqli_stmt :: $ error_listは、 phpのmysqli拡張機能を使用して準備されたステートメントを実行する際に非常に重要なデバッグツールです。 $ stmt->エラーのような最後のエラーを返すだけでなく、すべてのエラーメッセージを備えた配列を提供します。このプロパティは、1回の実行または準備中に複数のエラーが同時にトリガーされる場合に特に重要です。
ただし、開発者が$ stmt-> error_listで返された複数のエラーに直面した場合、それらはしばしば混乱します。これらのエラー情報をどのように効果的に抽出、処理、表示する必要があります。
この記事では、次の側面からの複数のエラー処理の戦略について説明します。
$ stmt-> error_list配列を返します。各要素は、次のキーを含む連想配列です。
errno :エラーコード(整数)
SQLSTATE :SQLSTATEエラー識別子(文字列)
エラー:エラーメッセージ(文字列)
典型的な構造は次のとおりです。
<span><span>[
[
</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; check the manual...'</span></span><span>
],
[
</span><span><span class="hljs-string">'errno'</span></span><span> => </span><span><span class="hljs-number">1048</span></span><span>,
</span><span><span class="hljs-string">'sqlstate'</span></span><span> => </span><span><span class="hljs-string">'23000'</span></span><span>,
</span><span><span class="hljs-string">'error'</span></span><span> => </span><span><span class="hljs-string">'Column \'name\' cannot be null'</span></span><span>
]
]
</span></span>
これは、エラーが1つしかないと仮定するのではなく、各エラーを個別に判断および処理する必要があることを意味します。
各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>->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>-></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>
すべての間違いが同様に重要であるわけではありません。次のような、 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>->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>
開発者が無視できることの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>-></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>->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>
開発フェーズでは、ブラウザまたは開発コンソールにエラーログを出力することをお勧めしますが、生産環境では、表示せずにログのみを記録する必要があります。
<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>->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">"<div class=\"sql-error\"><span class="hljs-subst">$message</span></span></span><span></div>";
}
}
}
</span></span>
mysqli_stmt :: $ error_listは、控えめだが強力なエラートラブルシューティングツールです。複雑なSQL操作を実行したり、多数のパラメーターをバインドしたり、複数のデータテーブルを接続したりすると、多くの場合、複数のエラーがあります。これらのエラーを正しく解析して分類することで、バグをすばやく修正するだけでなく、システムの堅牢性を改善します。
$ stmt-> error -master error_listを完全に見るのを停止すると、デバッグSQLが効率を複数に改善できることがわかります。
関連タグ:
mysqli_stmt