現在の位置: ホーム> 最新記事一覧> mysqli :: get_warningsとmysqli :: error_listの使用方法

mysqli :: get_warningsとmysqli :: error_listの使用方法

gitbox 2025-05-28

1。MySqli :: get_warningsmysqli :: error_listを理解します

1.1 mysqli :: get_warnings()

このメソッドは、 MySQLI_WARNINGオブジェクトを返し、データベースによって返されるすべての警告のトラバーサルを可能にします。正常に実行されますが、警告を返すSQLに適用されます。

 $mysqli = new mysqli("localhost", "user", "pass", "database");
$mysqli->query("YOUR SQL HERE");

if ($warning = $mysqli->get_warnings()) {
    do {
        echo "Warning: " . $warning->message . PHP_EOL;
    } while ($warning->next());
}

1.2 mysqli :: error_list

対照的に、 ERROR_LISTは、失敗したSQL実行情報をキャプチャするのに適したすべてのエラーメッセージ(エラーコードとメッセージを含む)を含む配列です。

 $result = $mysqli->query("BROKEN SQL");
if (!$result) {
    foreach ($mysqli->error_list as $error) {
        echo "Error [{$error['errno']}]: {$error['error']}" . PHP_EOL;
    }
}

2。ロギングロジックを統合します

より完全なロギングを実現するために、ログ関数、記録エラーと警告情報をカプセル化し、関連するコンテキスト(SQLステートメント、実行時間、アクセスソースなど)を記録することができます。

2.1コアコード構造

function log_db_activity(mysqli $mysqli, string $sql, $result): void {
    $log = [];

    // 記録SQL声明
    $log['sql'] = $sql;
    $log['time'] = date('c');

    // エラーを確認してください
    if (!$result && !empty($mysqli->error_list)) {
        $log['errors'] = $mysqli->error_list;
    }

    // 警告を確認してください
    if ($warning = $mysqli->get_warnings()) {
        $log['warnings'] = [];
        do {
            $log['warnings'][] = [
                'errno' => $warning->errno,
                'message' => $warning->message,
            ];
        } while ($warning->next());
    }

    if (!empty($log['errors']) || !empty($log['warnings'])) {
        // データベースまたは永続性方法に置き換えることができます
        file_put_contents(__DIR__ . '/db_log.json', json_encode($log, JSON_PRETTY_PRINT) . PHP_EOL, FILE_APPEND);
    }
}

2.2使い方

$mysqli = new mysqli("localhost", "user", "pass", "database");

$sql = "INSERT INTO users (id, name) VALUES (1, 'Tom')";
$result = $mysqli->query($sql);

log_db_activity($mysqli, $sql, $result);

3。典型的なシナリオでの値の症状

3.1インデックス障害警告

MySQLは、次のようなインデックス障害を引き起こす可能性のあるクエリを実行するときに警告を発します。

 $sql = "SELECT * FROM users WHERE name LIKE '%abc%'";

このSQLは合法であり、結果を返すことができますが、 get_warnings()はその効率の問題を明らかにすることができます。これは、インデックスの最適化またはクエリロジックの調整に役立ちます。

3.2データの切り捨て警告

フィールドの長さを超えるコンテンツの挿入は失敗することはないかもしれませんが、警告がトリガーされます。ログを介して、フィールド設計またはフロントエンド検証ロジックをタイムリーに検出および最適化できます。


4。リモートログサービスと統合します

大規模なプロジェクトでは、ログをローカルテキストにのみ保存しないでください。これらのログをさらにhttps://gitbox.net/api/logsなどのリモートログコレクションサービスにプッシュできます。

 function send_log_to_remote(array $log): void {
    $ch = curl_init('https://gitbox.net/api/logs');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => json_encode($log),
    ]);
    curl_exec($ch);
    curl_close($ch);
}