現在の位置: ホーム> 最新記事一覧> あなたは知っていますか? mysqli :: $ errnoは自動的にリセットされません。使用するときは、この落とし穴に注意してください

あなたは知っていますか? mysqli :: $ errnoは自動的にリセットされません。使用するときは、この落とし穴に注意してください

M66 2025-06-23

PHPのMySQLI拡張機能を使用する場合、 MySQLI :: $ ERRNOは、最後のデータベース操作からエラーコードを保存する非常に重要なプロパティです。通常、それを使用して、データベースの操作が成功しているか、エラー処理を実行しているかを判断します。しかし、注目すべき点、 Mysqli :: $ errnoがあります。これは、検出不可能なエラーにつながる可能性があります。今日は、この問題について説明しましょう。

1。mysqliの役割:: $ errno

mysqli :: $ errnoは、最後のデータベース操作のエラーコードを返すMySQLIクラスのプロパティです。データベース操作にエラーがない場合、 mysqli :: $ errnoは0を返します。代わりに、特定のエラータイプを示すエラーコードを返します。

たとえば、クエリを実行すると、クエリが成功した場合、 mysqli :: $ errnoが0を返します。クエリが失敗した場合、対応するエラーコードが返されます。

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

if ($mysqli->connect_errno) {
    echo "接続に失敗しました: " . $mysqli->connect_error;
    exit();
}

$query = "SELECT * FROM non_existent_table";
$mysqli->query($query);

if ($mysqli->errno) {
    echo "クエリに失敗しました,エラーコード:" . $mysqli->errno;
}
?>

上記の例では、クエリの実行中にエラーが発生した場合、 $ mysqli-> errnoはエラーを示す数値を返します。

2。重要な質問: mysqli :: $ errnoは自動的にリセットされません

問題は、mysqli :: $ errnoが各新しいデータベース操作の前に自動的にクリアされない場合に発生します。場合によっては、エラーコードが発生する可能性があり、その結果、後続のデータベース操作が障害と誤って判断されます。これにより、特定の操作を処理するときに非常に混乱する可能性があります。これは、後続の操作にエラーがない場合でも、 $ mysqli-> errnoが最後のエラーのエラーコードを返すためです。

例えば:

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

$query1 = "SELECT * FROM valid_table";
$mysqli->query($query1);

$query2 = "SELECT * FROM non_existent_table";
$mysqli->query($query2);

// 現時点では,$mysqli->errno 依然会返回上次错误查询的エラーコード,而不是当前查询的エラーコード
if ($mysqli->errno) {
    echo "クエリに失敗しました,エラーコード:" . $mysqli->errno;
}
?>

上記のコードでは、 $ mysqli-> errnoが2番目のクエリが失敗した場合でも、正しいエラーコードをすぐに表示しない場合があります(存在しないテーブルのクエリ)。実際、最初のクエリのエラーコードを表示し(存在する場合)、誤判断を引き起こす場合があります。

3.この問題を回避する方法

この落とし穴を避けるために、最善のことは、新しいクエリまたはデータベース操作を実行するたびに、 MySqli :: $ errnoを0に手動でリセットすることです。すべてのエラーコードは、mysqli :: clear_errors()メソッドを介してクリアできます。

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

$query1 = "SELECT * FROM valid_table";
$mysqli->query($query1);

// 手動でクリアされたエラー
$mysqli->clear_errors();

$query2 = "SELECT * FROM non_existent_table";
$mysqli->query($query2);

if ($mysqli->errno) {
    echo "クエリに失敗しました,エラーコード:" . $mysqli->errno;
}
?>

このようにして、各クエリの前に$ mysqli-> errnoがクリーンであることを確認することができ、古いエラーコードが新しい操作に干渉することを避けます。

4。結論

mysqli :: $ errnoは、MySqliの非常に有用なプロパティであり、データベースエラーを特定して処理するのに役立ちます。ただし、隠されたピットがあります。自動的にリセットされません。これは、エラーコードを手動でクリアしない場合、エラーコードが保持される可能性があり、後続の操作のエラー処理に影響することを意味します。これを回避するには、新しいデータベース操作を実行する前に、 mysqli :: clear_errors()メソッドを使用してエラーコードを手動でクリアすることをお勧めします。