現在の位置: ホーム> 最新記事一覧> mysqli :: $ errnoは共有されていますか?複数の接続されたインスタンス間のエラー状態の相互汚染を回避する方法

mysqli :: $ errnoは共有されていますか?複数の接続されたインスタンス間のエラー状態の相互汚染を回避する方法

M66 2025-06-23

PHP開発では、 MySQLI :: $ errnoおよびmysqli :: $ errorプロパティは、データベース操作にMySqliを使用する場合に重要な役割を果たします。 mysqli :: $ errnoは、現在の接続のエラーコードを取得するために使用され、 mysqli :: $エラーはエラー情報を取得するために使用されます。開発者はしばしばこの問題に遭遇します。複数のデータベース接続インスタンスでは、 mysqli :: $ errnoの価値は共有されていますか?共有されている場合、異なる接続間のエラー状態を互いに影響を回避するにはどうすればよいですか?この記事では、この問題を詳細に分析し、エラー状態の汚染を避けるためのいくつかのソリューションを提供します。

mysqli :: $ errnoは共有されていますか?

mysqli :: $ errnoは、現在のデータベース接続に関連するエラーコードを保持するmysqliオブジェクトのインスタンスプロパティです。通常の場合、 MySqli :: $ errnoの役割は、現在のデータベース接続インスタンスにエラーステータスを記録することです。

共有されていますか?

mysqli :: $ errno非共有です。つまり、各mysqli接続インスタンスには独自のerrno状態があります。各独立したデータベース接続は独立して独自のエラーコードを維持するため、異なる接続インスタンス間のerrnosは互いに汚染されません。

ただし、複数の接続インスタンスが同じMySQLIオブジェクトを介して作成されている場合、エラー状態は互いに干渉する場合があります。特に、複数のデータベース接続を使用してMySQLIオブジェクトを共有する場合は、一貫性のないエラーメッセージを避けるために、各接続のエラーステータスを管理するように注意することをお勧めします。

エラー状態が互いに汚染するのはなぜですか?

問題は主に次の状況で発生します。

  1. 同じデータベース接続を共有する:複数の操作が同じデータベース接続オブジェクト(つまり、同じmysqliインスタンス)を共有する場合、エラーステータス( errno )が最後の操作によって上書きされ、前の操作のエラーメッセージが失われます。

  2. 同じmysqliインスタンスを再利用します。同じmysqliインスタンスをさまざまな場所で繰り返し使用し、エラーステータスをリセットしない場合、エラーメッセージの混乱を引き起こし、後続の操作に影響を与える可能性があります。

間違った状態の相互汚染を避ける方法は?

複数の接続されたインスタンス間の相互汚染を回避するために、次の方法を使用できます。

1.さまざまなmysqliインスタンスを使用します

最も簡単な方法は、各データベース接続が個別のMySQLIインスタンスを使用することを確認することです。このようにして、各接続には独自のERRNOエラー状態があり、互いに影響しません。

 // 最初のデータベース接続を作成します
$mysqli1 = new mysqli("localhost", "user1", "password1", "database1");
if ($mysqli1->connect_errno) {
    echo "接続に失敗しました: " . $mysqli1->connect_error;
}

// 2番目のデータベース接続を作成します
$mysqli2 = new mysqli("localhost", "user2", "password2", "database2");
if ($mysqli2->connect_errno) {
    echo "接続に失敗しました: " . $mysqli2->connect_error;
}

2。mysqli :: reset_errorメソッドを使用します

MySQLIクラスは、 RESET_ERRORメソッドを提供します。これは、接続のエラーステータスを手動でリセットするために使用できます。各データベース操作の後、この方法を呼び出してErrnoエラーをクリアして、誤った情報の汚染を避けます。

 // データベース操作を実行します
$result = $mysqli->query("SELECT * FROM users");
if (!$result) {
    echo "クエリに失敗しました: " . $mysqli->error;
}

// エラーステータスをリセットします
$mysqli->reset_error();

3.異なるデータベース接続構成を使用します

アプリケーションが複数のデータベースと対話する必要がある場合は、異なる接続構成を使用して独立した接続インスタンスを作成することを検討してください。さまざまなホスト名、ユーザー名、パスワードなどを構成することにより、各接続インスタンスが異なる構成の下で実行され、互いに干渉しないようにすることができます。

 // 例外処理を使用してエラーをキャッチします
try {
    $mysqli->query("SELECT * FROM non_existing_table");
} catch (Exception $e) {
    echo "数据库クエリに失敗しました: " . $e->getMessage();
    $mysqli->reset_error();
}