現在の位置: ホーム> 最新記事一覧> 結果セットをリリースするのを忘れた$ errnoが異常に変化する原因

結果セットをリリースするのを忘れた$ errnoが異常に変化する原因

M66 2025-05-29

データベース操作にMySqliを使用する場合、 MySqli :: $ errnoの異常な変化の問題に遭遇することがよくあります。 mysqli :: $ errnoは、データベース接続またはクエリ中にエラーコードを取得するために使用される属性です。通常、開発者がエラーのトラブルシューティングに役立ちます。ただし、クエリを作成すると、 MySqli :: $ errnoの価値が期待と矛盾して変化し、プログラムで予期しない動作をもたらすことがあることがわかります。現時点では、潜在的な理由はしばしば見落とされがちです - 結果セットはリリースされません。

mysqli :: $ errnoとは何ですか?

mysqli :: $ errnomysqliオブジェクトのプロパティです。以前のMySQL操作(クエリ、接続など)で生成されたエラーコードを保存します。操作が成功した場合、 mysqli :: $ errnoは0を返します。操作が失敗した場合、ゼロ以外のエラーコードが返されます。これらのエラーコードに基づいて、MySQLエラーの特定の原因を見つけることができます。

一般的なエラーコードは次のとおりです。

  • 1045:拒否されたアクセス(ユーザーのアクセス拒否)

  • 1064:構文エラー(構文エラー)

  • 2002:MySQL Serverに接続できません(MySQL Serverに接続できません)

通常、データベースの操作が失敗した場合、 mysqli :: $ errnoおよびmysqli :: $ error (エラーメッセージ)を使用して問題を決定できます。

なぜそれが異常に変化するのですか?

クエリにmysqliを使用する場合、 MySqli :: $ errnoの値は、特にクエリが実行された後、予想どおりに無意味になることがあります。クエリの結果が時間に設定されている場合、 mysqli :: $ errnoが非現実的なエラーコードになる可能性があります。これは、MySQLの接続リソースが完全にリリースされておらず、その後の影響を受ける可能性のあるクエリをもたらすためです。

結果セットのリリースの役割

mysqli_query()などの関数を使用してクエリを実行すると、mysqlはクエリの結果をメモリに保存します。リソースを保存するには、クエリが完了した後、 mysqli_free_result()関数を使用して、クエリ結果セットを明示的にリリースする必要があります。これは、自由なメモリに役立つだけでなく、未発表の結果セットの影響を受ける可能性のある後続の操作を回避します。

結果セットはリリースされません

クエリを実行し、クエリが完了した後、 mysqli_free_result()が結果セットを解放するために呼び出されないとします。次に、別のクエリ操作を実行しようとすると、次の状況に遭遇する可能性があります。

 <?php
// データベースに接続します
$mysqli = new mysqli('localhost', 'root', 'password', 'test_db');

// 最初のクエリを実行します
$result1 = $mysqli->query("SELECT * FROM users");

// 結果セットがリリースされていない場合
// $mysqli->free_result($result1);  // リリースを無視します

// 2番目のクエリを実行します
$result2 = $mysqli->query("SELECT * FROM orders");

// エラーメッセージを取得します
echo "エラーコード: " . $mysqli->errno;
?>

上記のコードでは、最初のクエリの結果セットをリリースしなかったため、 $ mysqli-> errnoは2番目のクエリに例外があるため、エラーコードを正しく取得できなくなり、エラーステータスコードさえ返されます。これは、mysqli :: $ errnoの異常な変化の根本原因です。

それを解決する方法は?

mysqli :: $ errnoの異常な変化を回避するには、各クエリが実行された後、クエリ結果セットが時間内にリリースされることを確認する必要があります。それを行う正しい方法は次のとおりです。

 <?php
// データベースに接続します
$mysqli = new mysqli('localhost', 'root', 'password', 'test_db');

// 最初のクエリを実行します
$result1 = $mysqli->query("SELECT * FROM users");

// 結果セットをリリースします
if ($result1) {
    $result1->free();
}

// 2番目のクエリを実行します
$result2 = $mysqli->query("SELECT * FROM orders");

// エラーメッセージを取得します
echo "エラーコード: " . $mysqli->errno;
?>

結果セットを明示的にリリースすることにより、各クエリ後のリソースがクリーンアップされ、その後の操作に影響を及ぼさないようにすることができます。

まとめ

データベース操作にMySQLIを使用する場合、 MySQLI :: $ errnoの異常な変化の理由は、クエリ結果セットのリリースを忘れていることが多いことがよくあります。結果セットをリリースすると、メモリを保存するだけでなく、その後の操作が影響を受けないようにします。したがって、各クエリが完了した後、 MySQLI_FREE_RESULT()または$ result-> free()を使用してクエリ結果セットをリリースし、不必要なエラーと例外を回避する必要があります。

関連リソース

mysqliの操作とエラーを回避する方法をよりよく理解するのに役立つには、次のリソースを参照できます。