현재 위치: > 최신 기사 목록> 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);
}