현재 위치: > 최신 기사 목록> mysqli :: get_warnings mysqli :: query와 함께 사용하는 올바른 방법입니다

mysqli :: get_warnings mysqli :: query와 함께 사용하는 올바른 방법입니다

gitbox 2025-06-04

데이터베이스 작업에 PHP의 MySQLI Extension을 사용할 때는 일반적으로 쿼리가 성공했는지 여부와 오류가 발생했는지 여부에주의를 기울이지 만 종종 무시되는 상황이 있습니다. 이러한 경고가 구체적으로 다루지 않으면 현장 자르기, 기본값 대체 등과 같은 잠재적 인 문제를 숨길 수 있습니다.이 기사는 MySQLI :: Query ()MySQLI :: get_warnings ()를 사용하여 이러한 경고를 포착하고 모범 사례를 제공하는 방법을 공유합니다.

SQL 경고를 따라야하는 이유는 무엇입니까?

다음과 같은 SQL을 고려하십시오.

 $sql = "INSERT INTO users (username, email) VALUES ('this_is_a_very_long_username_that_will_be_truncated', '[email protected]')";

사용자 이름 필드의 최대 길이가 30 자라고 가정하면 위의 SQL의 실제 실행이 잘립니다. 오류는 없지만 경고가 발생합니다. 우리가 그것을 무시하면, 데이터는 당신이 알지 못하고 조용히 "처리"됩니다.

mysqli :: get_warnings는 무엇을합니까?

mysqli :: get_warnings ()는 이전 작업에서 SQL 경고 정보를 얻는 데 사용되는 메소드입니다. 경고 레벨, 코드 및 디버그 또는 로그에 사용할 수있는 메시지가 포함 된 객체를 반환합니다.

실제 사용 예

먼저 기본 사용법을 이해하려면 최소한의 예를 살펴 보겠습니다.

 <?php

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

if ($mysqli->connect_error) {
    die("연결이 실패했습니다: " . $mysqli->connect_error);
}

$sql = "INSERT INTO demo (name) VALUES ('여분의 긴 스트링 트리거 경고 경고 경고 트리거 경고 경고 경고 경고')";

if ($mysqli->query($sql)) {
    echo "성공적으로 삽입하십시오\n";

    // 경고를 확인하십시오
    $warning = $mysqli->get_warnings();
    while ($warning) {
        echo "경고하다: [{$warning->errno}] {$warning->message}\n";
        $warning = $warning->next();
    }

} else {
    echo "쿼리가 실패했습니다: " . $mysqli->error;
}

$mysqli->close();

실제 제안 : 로그 경고

실제 프로젝트에서는 사용자에게 직접 경고를 출력하는 것이 아니라 로그에 로그인하는 것이 좋습니다. 예를 들어:

 function log_warnings($mysqli) {
    $warning = $mysqli->get_warnings();
    while ($warning) {
        error_log("SQL Warning [{$warning->errno}]: {$warning->message}");
        $warning = $warning->next();
    }
}

$sql = "UPDATE users SET username='지나치게 긴 이름이 잘릴 것입니다' WHERE id=1";

if ($mysqli->query($sql)) {
    log_warnings($mysqli);
} else {
    error_log("SQL Error: " . $mysqli->error);
}

로그에 로그인하면 나중에 문제를 해결하는 데 도움이 될뿐만 아니라 테스트 환경에서 SQL 품질에 대한 피드백도 제공합니다.

주목해야 할 것

  1. get_warnings ()는 마지막 쿼리에만 작동합니다.

  2. 링크 된 목록과 유사한 객체를 반환하고 다음 () 에 의해 통과합니다.

  3. 모든 드라이버가 경고를 완전히 지원하는 것은 아니며 사용하기 전에 데이터베이스 구성을 테스트해야합니다.

  4. mysqli_report ()는 get_warnings ()를 대체 할 수 없으며, 전자는 오류에 더 많은주의를 기울입니다.

  5. 준비 문장 ( 준비 )을 사용하여 매개 변수를 바인딩 할 때와 같이 경고를 시작하고 경고를받습니다.

보충 : 생산 환경에서 사용됩니다

생산 경고를 요약하고 정기적으로보고 할 수 있으며, 데이터베이스 어시스턴트 클래스를 캡슐화하여 수행 할 수 있습니다.

 class DB {
    protected $mysqli;

    public function __construct() {
        $this->mysqli = new mysqli("localhost", "user", "password", "appdb");
    }

    public function query($sql) {
        $result = $this->mysqli->query($sql);
        if ($result) {
            $this->logWarnings();
        } else {
            error_log("SQL Error: " . $this->mysqli->error);
        }
        return $result;
    }

    protected function logWarnings() {
        $warning = $this->mysqli->get_warnings();
        while ($warning) {
            error_log("[DB경고하다] {$warning->errno} - {$warning->message}");
            $warning = $warning->next();
        }
    }
}

$db = new DB();
$db->query("UPDATE posts SET title='标题过长会触发경고하다,길이 관리에주의하십시오' WHERE id=42");

요약

mysqli :: query () 는 SQL을 실행하기위한 강력한 도구이며 mysqli :: get_warnings ()는 데이터 무결성을 보장하는 중요한 보충제입니다. 이러한 경고 메시지를 무시하지 마십시오. 종종 미래의 버그를 숨 깁니다. 개발 또는 테스트 환경에서 경고를 포착하고 취급하는 습관을 개발하면 프로젝트의 견고성과 유지 가능성을 크게 향상시킬 수 있습니다.

기억하십시오 : 오류로 인해 프로그램이 소멸되면 경고로 인해 트랩이 손실됩니다.