현재 위치: > 최신 기사 목록> 정적 코드 분석의 일부로 mysqli :: get_warnings를 사용하십시오

정적 코드 분석의 일부로 mysqli :: get_warnings를 사용하십시오

gitbox 2025-05-29

1. mysqli :: get_warnings의 역할을 이해하십시오

mysqli :: get_warnings는 가장 최근의 MySQL 작업에서 경고를 생성하는 데 사용됩니다. 오류와 비교할 때 경고는 종종 SQL 문의 실행에 영향을 미치지 않지만 데이터 예외, 성능 문제 또는 잠재적 논리적 결함을 숨길 수 있습니다.

 $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
    die("연결이 실패했습니다:" . $mysqli->connect_error);
}

$result = $mysqli->query("YOUR SQL QUERY");
if ($result) {
    if ($warnings = $mysqli->get_warnings()) {
        do {
            echo "경고 코드: " . $warnings->errno . " - " . $warnings->message . "\n";
        } while ($warnings->next());
    }
}

이러한 경고를 합리적으로 포착하고 처리하면 숨겨진 위험의 축적을 방지 할 수 있습니다.


2. 정적 분석에서 발생하는 문제

정적 분석 도구 (예 : PHPSTAN, PSALM)는 일반적으로 코드에서 유형 오류, 잠재적 예외 및 사용하지 않는 변수를 확인하지만 기본적으로 런타임에 생성 된 데이터베이스 경고에주의를 기울이지 않습니다. get_warnings는 복잡한 객체를 반환하기 때문에 이러한 경고가 잘 확인되어 코드에서 사용되지 않으면 다음과 같은 위험이있을 수 있습니다.

  • 경고는 검사되지 않아 잠재적 위험이 무시됩니다.

  • 경고 객체는 올바르게 가로 지르거나 릴리스되지 않습니다.

  • get_warnings 결과는 잘못 사용되거나 무시됩니다.


3. 정적 분석 프로세스를 통합하는 방법

3.1 사용자 정의 규칙 또는 확장 플러그인 작성

일부 정적 분석 도구는 사용자 정의 규칙을 지원합니다. 플러그인을 작성하여 다음과 같은 일반적인 문제를 감지 할 수 있습니다.

  • 각 쿼리가 실행 된 후 get_warnings가 호출되는지 여부.

  • get_warnings 에 의해 반환 된 물체가 가로지고 기록되었는지 여부.

  • 경고 객체의 반환이 무시되는 상황이 있습니까?

예를 들어, phpstan의 경우 get_warnings 에 대한 호출과 mysqli :: query 에 대한 호출이 이어지는 지 확인하기위한 규칙을 정의 할 수 있습니다.

3.2 코드 사양에서 분명히 필요합니다

모든 데이터베이스 작업이 경고를 명시 적으로 처리하도록 요구하는 팀 코드 사양을 개발합니다.

  • SQL 문을 실행 한 후 $ mysqli-> get_warnings ()를 호출하십시오.

  • 반복 및 출력 또는 로그 경고.

  • 무시할 수없는 경고의 경우 예외를 제외하거나 중요한 오류를 기록하십시오.

3.3 단위 테스트 범위

단위 테스트가 데이터베이스를 시뮬레이션하여 경고를 생성하는 시나리오를 작성하고 코드가 올바르게 캡처되어 처리되었는지 확인하십시오.

 // 샘플 데이터베이스 경고 테스트 예제
class DatabaseWarningTest extends \PHPUnit\Framework\TestCase
{
    public function testGetWarningsHandled()
    {
        $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
        $mysqli->query("YOUR SQL QUERY THAT CAUSES WARNING");

        $warnings = $mysqli->get_warnings();
        $this->assertNotNull($warnings, '경고를 포착해야합니다');
        while ($warnings) {
            $this->assertIsInt($warnings->errno);
            $this->assertIsString($warnings->message);
            $warnings = $warnings->next();
        }
    }
}

4. 코드 데모 : 완전한 경고 처리 프로세스

 $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
    die("연결이 실패했습니다:" . $mysqli->connect_error);
}

$query = "INSERT INTO users (name, email) VALUES ('장 산', '[email protected]')";
$result = $mysqli->query($query);

if ($result === false) {
    // 처리 오류
    echo "SQL실수:" . $mysqli->error;
} else {
    $warnings = $mysqli->get_warnings();
    if ($warnings) {
        do {
            // 기록 경고 정보,또는 프로젝트 요구 사항에 따라 처리하십시오
            error_log("数据库경고 코드: {$warnings->errno}, 정보: {$warnings->message}");
        } while ($warnings->next());
    }
    echo "운영이 성공적입니다,그리고 경고가 처리되었습니다";
}

5. 요약

mysqli :: get_warnings를 정적 분석 프로세스에 통합하는 것은 모든 데이터베이스 작업 경고가 올바르게 캡처되고 처리되도록하는 주요 목적입니다. 정적 분석 규칙을 사용자 정의하고 팀 사양을 강화하고 단위 테스트를 개선함으로써 코드 품질을 크게 향상시킬 수 있으며 숨겨진 위험을 줄일 수 있습니다. 좋은 예외 처리 및 로깅을 결합한 개발자는 데이터베이스 상호 작용 코드를보다 침착하게 유지하여 경고를 무시함으로써 발생하는 잠재적 인 문제를 피할 수 있습니다.