현재 위치: > 최신 기사 목록> 다음 _result () 전환 프로세스 중에 문제를 추적하기 위해 로그를 사용하십시오

다음 _result () 전환 프로세스 중에 문제를 추적하기 위해 로그를 사용하십시오

gitbox 1970-01-01

Next_result () 함수는 PHP와 MySQL의 MySQLI Extension을 사용하여 멀티 스테이트 쿼리를 처리 할 때 중요한 역할을합니다. 그것은 여러 결과 세트를 순서대로 가져올 수 있지만 때로는 "동기화 명령, 지금이 명령을 실행할 수 없다"와 같은 결과 세트를 전환 할 때 다양한 예상치 못한 문제가 발생할 수 있습니다. 이 기사는 로깅을 통해 Next_result () 함수와 관련된 문제를 찾아서 문제를 해결하는 방법을 소개합니다.

1. Next_result () 의 역할을 이해합니다.

mysqli :: multi_query ()를 사용하면 쿼리에서 여러 SQL 문을 보낼 수 있으며 Next_Result () 는 이러한 결과 세트를 차례로 통과하는 데 사용됩니다. 예를 들어:

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

$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }
    } while ($mysqli->next_result());
} else {
    error_log("Query failed: " . $mysqli->error);
}

next_result () 가 올바르게 호출되지 않거나 중간에서 오류가 발생하면 연결 상태에 대한 예외가 발생합니다.

2. 자주 묻는 질문

  • 오류 메시지 : "동기화 된 명령; 지금이 명령을 실행할 수 없습니다"

  • 쿼리가 중단되어 결과가 불완전합니다

  • 다음 SQL을 계속 실행할 수 없습니다

이러한 문제의 대부분은 결과가 완전히 처리되지 않았거나 next_result () 에 대한 호출이 호출되지 않았다는 사실과 관련이 있습니다.

3. 로그를 통해 확인하십시오

문제를 해결하기 위해 각 단계에서 로그를 기록하고 통화 프로세스 및 상태를 추적 할 수 있습니다. 로그 파일에 terver_log ()를 사용하는 것이 좋습니다.

 function log_step($message) {
    $logFile = '/var/log/php_next_result_debug.log';
    error_log(date("[Y-m-d H:i:s] ") . $message . PHP_EOL, 3, $logFile);
}

위의 쿼리 예제와 함께 로그 출력을 추가합니다.

 $sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
    log_step("Multi-query started.");

    do {
        if ($result = $mysqli->store_result()) {
            log_step("Result set retrieved.");
            while ($row = $result->fetch_assoc()) {
                log_step("Row: " . json_encode($row));
            }
            $result->free();
        } elseif ($mysqli->errno) {
            log_step("Error during store_result: " . $mysqli->error);
        }

        log_step("Calling next_result()...");
    } while ($mysqli->next_result());

    log_step("All result sets processed.");
} else {
    log_step("Multi-query failed: " . $mysqli->error);
}

4. SQL 실행의 시각적 추적 추가 (선택 사항)

보다 자세한 추적이 필요한 경우 각 SQL 실행 지점에서 SQL 컨텐츠, 실행 시간 및 상태 코드를 기록 할 수 있습니다. 또한 로그는 Elk, Graylog 또는 자체 제작 된 로깅 플랫폼으로 보내는 것과 같이 시각적으로 중앙에서 관리 할 수 ​​있습니다.

 log_step("SQL Executed: " . $sql . " on https://gitbox.net/db-query-monitor");

5. 요약 및 제안

  1. 항상 모든 결과 세트를 처리하고 Next_Result ()를 호출하십시오.

  2. 통나무를 사용하여 모든 키 단계를 기록하여 심리 후 쉽게 기록하십시오.

  3. 예외가 발생하면 mysqli :: errormysqli :: errno를 무시하지 마십시오.

  4. 쉬운 재사용을 위해 내장 로그 로직을 사용하여 통합 된 멀티 쿼리 실행 기능을 캡슐화 할 수 있습니다.