현재 위치: > 최신 기사 목록> 데이터베이스 드라이버 클래스에서 mysqli :: get_warnings를 캡슐화하기위한 모범 사례

데이터베이스 드라이버 클래스에서 mysqli :: get_warnings를 캡슐화하기위한 모범 사례

gitbox 2025-05-28

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

mysqli :: get_warnings는 SQL 문을 실행할 때 모든 경고를 포함하는 MySQLI_Warning 객체의 체인을 반환합니다. 이 기능을 사용하여 쉽게 처리 할 수 ​​있도록 데이터 자료, 데이터 유형 불일치, 인덱스 고장 등과 같은 치명적 인 문제를 캡처하십시오.

그러나이 메소드를 직접 호출하는 것이 번거 롭고 반환 된 링크 된 목록 구조를 가로 지르고 있어야합니다. 클래스 방법으로이를 캡슐화 한 후 호출 프로세스를 단순화하고 경고 정보를 균일하게 처리 할 수 ​​있습니다.


2. 포장을위한 기본 아이디어

  • 데이터베이스 드라이버 클래스에서 경고 정보를 얻으려면 공개 방법을 추가하십시오.

  • 이 방법은 mysqli :: get_warnings를 호출하고 경고 목록을 반복하여 모든 경고를 배열 또는 문자열로 정렬합니다.

  • 쉬운 로깅 또는 디스플레이를위한 형식의 출력을 제공합니다.

  • 이 방법은 잠재적 인 문제를 캡처하기 위해 SQL 작업을 수행 한 후 사전에 호출됩니다.


3. 샘플 코드 구현

 <?php

class DatabaseDriver
{
    /** @var mysqli */
    protected $mysqli;

    public function __construct($host, $user, $password, $dbname, $port = 3306)
    {
        $this->mysqli = new mysqli($host, $user, $password, $dbname, $port);
        if ($this->mysqli->connect_errno) {
            throw new Exception("Connect failed: " . $this->mysqli->connect_error);
        }
    }

    /**
     * 구현하다 SQL 질문
     *
     * @param string $sql
     * @return mysqli_result|bool
     */
    public function query(string $sql)
    {
        $result = $this->mysqli->query($sql);
        // 질문后可以检查警告
        $warnings = $this->getWarnings();
        if (!empty($warnings)) {
            // 로깅 또는 예외 처리를 수행 할 수 있습니다
            foreach ($warnings as $warning) {
                error_log("MySQL Warning [{$warning['errno']}]: {$warning['message']} (SQLSTATE: {$warning['sqlstate']})");
            }
        }
        return $result;
    }

    /**
     * 현재 연결에 대한 모든 경고 메시지를 받으십시오
     *
     * @return array 경고 메시지 배열,각 요소에는 포함됩니다 errno, sqlstate, message
     */
    public function getWarnings(): array
    {
        $warnings = [];
        $warning = $this->mysqli->get_warnings();
        while ($warning) {
            $warnings[] = [
                'errno' => $warning->errno,
                'sqlstate' => $warning->sqlstate,
                'message' => $warning->message,
            ];
            $warning = $warning->next;
        }
        return $warnings;
    }

    public function close()
    {
        $this->mysqli->close();
    }
}

// 사용의 예
$db = new DatabaseDriver('localhost', 'root', 'password', 'testdb');
$db->query("INSERT INTO users (id, name) VALUES (1, 'Alice')");
$db->close();


4. 키 포인트 분석 및 개선 기술

4.1 반복적 인 경고를 피하십시오

get_warnings는 현재 연결에 대한 경고를 반환하고 정리하거나 제대로 사용하지 않으면 오래된 경고를 반복적으로 읽을 수 있습니다. 일반적으로 각 명령문이 실행되거나 필요한 경우 MySQLI :: CLEAR_WARNINGS () (PHP 8.1+에서 지원)를 호출하여 후속 작업과의 간섭을 방지하기 위해 경고 체인을 지울 수 있습니다.

4.2 통합 예외 또는 로그 처리

캡슐화의 배열에서 경고 정보를 반환하는 것이 좋습니다. 호출 계층은 요구에 따라 로그를 기록할지 여부를 결정할 수 있으며 유연성을 향상시킵니다.

4.3 호환성 및 오류 처리

일부 초기 PHP 버전은 get_warnings를 불완전하게 지원합니다. 캡슐화 할 때 버전 호환성을 고려해야하거나 버전 검사를 사용하여 다른 오류 처리 방법으로 돌아 가야합니다.


5. 요약

데이터베이스 드라이버 클래스에서 mysqli :: get_warnings 캡슐화는 코드의 재사용 성을 향상시킬뿐만 아니라 잠재적 인 SQL 실행 문제의 캡처 및 처리를 용이하게합니다. 합리적인 캡슐화 및 호출을 통해 시스템의 견고성 및 디버깅 기능을 크게 향상시킬 수 있습니다.

데이터베이스 드라이버 클래스를 설계하거나 유지하는 경우 경고 캡처 메커니즘을 포함하고 로그 또는 예외 메커니즘을 결합하여 데이터베이스 작업을보다 투명하고 안전하게 만드는 것이 좋습니다.