현재 위치: > 최신 기사 목록> mysqli :: get_warnings를 보편적 경고 캡처 모듈로 캡슐화하는 방법

mysqli :: get_warnings를 보편적 경고 캡처 모듈로 캡슐화하는 방법

gitbox 2025-05-26

PHP를 사용하여 MySQL 데이터베이스를 연결하고 조작 할 때 MySQLI 확장은 SQL을 실행하기 위해 mysqli :: query , mysqli :: repay 등과 같은 풍부한 방법을 제공합니다. 그러나 실제 개발에서 SQL의 성공 여부에주의를 기울일뿐만 아니라 때로는 실행 프로세스를 얻어야합니다. 이러한 경고로 인해 SQL 실행이 실패하지는 않지만 잠재적 인 문제를 숨 깁니다.

PHP의 mysqli :: get_warnings 메소드는 연결의 마지막 작업에 의해 생성 된 모든 경고를 얻을 수 있습니다. 그러나 사용은 종종 단편화되며 모듈로 마무리 할 수 ​​있다면 프로젝트에서 쉽게 재사용하고 코드를 깔끔하게 유지할 수 있습니다.

이 기사에서는 mysqli :: get_warnings를 재사용 가능한 MySQL 경고 캡처 모듈로 캡슐화하는 방법을 설명합니다.

1. 배경 지식

mysqli :: get_warnings () 메소드는 모든 경고 정보에 액세스 할 수있는 mysqli_warning 객체의 링크 된 목록에 대한 참조를 반환합니다. 각 mysqli_warning 객체에는 다음 정보가 포함되어 있습니다.

  • 메시지 : 경고 메시지

  • sqlstate : sqlstate 오류 코드

  • Errno : MySQL 오류 코드

2. 모듈 디자인 아이디어

우리의 목표는 다음을 수행 할 수있는 경고 컬렉터 클래스를 구현하는 것입니다.

  • mysqli 인스턴스에 바인딩;

  • SQL 문을 실행하고 자동으로 경고 정보를 수집합니다.

  • 경고 정보를 형식화하고 로그로 반환하십시오.

  • 다음 작업에 영향을 미치기 위해 경고 정보를 피하기위한 경고 청소 방법을 제공하십시오.

3. 모듈 코드 구현

다음은 완전한 구현 코드입니다.

 <?php

class WarningCollector
{
    private mysqli $conn;
    private array $warnings = [];

    public function __construct(mysqli $connection)
    {
        $this->conn = $connection;
    }

    public function execute(string $sql): bool|mysqli_result
    {
        $result = $this->conn->query($sql);
        $this->collectWarnings();
        return $result;
    }

    private function collectWarnings(): void
    {
        $this->warnings = []; // 오래된 데이터
        $warning = $this->conn->get_warnings();
        while ($warning) {
            $this->warnings[] = [
                'errno'    => $warning->errno,
                'sqlstate' => $warning->sqlstate,
                'message'  => $warning->message,
            ];
            $warning = $warning->next();
        }
    }

    public function getWarnings(): array
    {
        return $this->warnings;
    }

    public function hasWarnings(): bool
    {
        return !empty($this->warnings);
    }

    public function logWarnings(string $logPath = '/tmp/mysql_warnings.log'): void
    {
        if ($this->hasWarnings()) {
            foreach ($this->warnings as $w) {
                $entry = sprintf(
                    "[%s] MySQL Warning - Errno: %d, SQLSTATE: %s, Message: %s\n",
                    date('Y-m-d H:i:s'),
                    $w['errno'],
                    $w['sqlstate'],
                    $w['message']
                );
                file_put_contents($logPath, $entry, FILE_APPEND);
            }
        }
    }
}

4. 예제를 사용하십시오

이 모듈을 사용하는 것은 매우 간단합니다. SQL을 실행하기 전에 연결을 캡슐화하는 데 사용하십시오.

 <?php

$mysqli = new mysqli('localhost', 'user', 'pass', 'database');
$collector = new WarningCollector($mysqli);

// 구현하다 SQL
$sql = "INSERT INTO demo (name) VALUES ('duplicate-key')";
$collector->execute($sql);

// 경고를 확인하십시오
if ($collector->hasWarnings()) {
    $collector->logWarnings();
    print_r($collector->getWarnings());
}

5. 실제 응용 시나리오

이 캡슐화는 다음과 같은 범주의 프로젝트에서 특히 유용합니다.

  • 데이터 마이그레이션 스크립트 : 경고는 현장 자리 또는 유형 불일치를 나타낼 수 있습니다.

  • 배치 가져 오기 도구 : 큰 배치의 데이터를 삽입 할 때 제약 관련 경고가 쉽게 트리거됩니다.

  • 데이터 품질 모니터링 : 나중에 분석을 위해 로그 시스템을 통한 중앙 집중식 경고 수집;

Laravel, Symfony 등과 같은 프레임 워크를 사용하는 경우 종속성 주입에 대한이 아이디어를 기반으로 미들웨어 또는 서비스 클래스로 캡슐화 할 수도 있습니다.

6. 주목할만한 것들

  • mysqli :: get_warnings ()는 마지막 작업에 의해 발생하는 경고 만 얻을 수 있으므로 각 SQL 실행 직후에 즉시 호출하십시오.

  • 준비된 진술을 사용하는 경우 경고를 받기 전에 실행하는 것이 좋습니다.

  • 다른 MySQL 버전은 경고에 대한 지원 수준이 약간 다릅니다. 개발 및 생산 환경 버전은 일관되게하는 것이 좋습니다.

7. 결론

mysqli :: get_warnings를 모듈로 캡슐화함으로써 우리는 SQL 경고를보다 쉽게 ​​캡처하고 처리 할뿐만 아니라 시스템의 유지 관리 및 견고성을 향상시키는 데 도움이됩니다. 로그 채널 지원 추가, 경고 레벨 필터링 등과 같은 프로젝트 구조에 따라 더 확장 할 수 있습니다.

전체 프로젝트 예는 다음을 참조하십시오.
https://gitbox.net/example/mysql-warning-collector