mysqli :: get_warnings는 SQL 문을 실행할 때 모든 경고를 포함하는 MySQLI_Warning 객체의 체인을 반환합니다. 이 기능을 사용하여 쉽게 처리 할 수 있도록 데이터 자료, 데이터 유형 불일치, 인덱스 고장 등과 같은 치명적 인 문제를 캡처하십시오.
그러나이 메소드를 직접 호출하는 것이 번거 롭고 반환 된 링크 된 목록 구조를 가로 지르고 있어야합니다. 클래스 방법으로이를 캡슐화 한 후 호출 프로세스를 단순화하고 경고 정보를 균일하게 처리 할 수 있습니다.
데이터베이스 드라이버 클래스에서 경고 정보를 얻으려면 공개 방법을 추가하십시오.
이 방법은 mysqli :: get_warnings를 호출하고 경고 목록을 반복하여 모든 경고를 배열 또는 문자열로 정렬합니다.
쉬운 로깅 또는 디스플레이를위한 형식의 출력을 제공합니다.
이 방법은 잠재적 인 문제를 캡처하기 위해 SQL 작업을 수행 한 후 사전에 호출됩니다.
<?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();
get_warnings는 현재 연결에 대한 경고를 반환하고 정리하거나 제대로 사용하지 않으면 오래된 경고를 반복적으로 읽을 수 있습니다. 일반적으로 각 명령문이 실행되거나 필요한 경우 MySQLI :: CLEAR_WARNINGS () (PHP 8.1+에서 지원)를 호출하여 후속 작업과의 간섭을 방지하기 위해 경고 체인을 지울 수 있습니다.
캡슐화의 배열에서 경고 정보를 반환하는 것이 좋습니다. 호출 계층은 요구에 따라 로그를 기록할지 여부를 결정할 수 있으며 유연성을 향상시킵니다.
일부 초기 PHP 버전은 get_warnings를 불완전하게 지원합니다. 캡슐화 할 때 버전 호환성을 고려해야하거나 버전 검사를 사용하여 다른 오류 처리 방법으로 돌아 가야합니다.
데이터베이스 드라이버 클래스에서 mysqli :: get_warnings 캡슐화는 코드의 재사용 성을 향상시킬뿐만 아니라 잠재적 인 SQL 실행 문제의 캡처 및 처리를 용이하게합니다. 합리적인 캡슐화 및 호출을 통해 시스템의 견고성 및 디버깅 기능을 크게 향상시킬 수 있습니다.
데이터베이스 드라이버 클래스를 설계하거나 유지하는 경우 경고 캡처 메커니즘을 포함하고 로그 또는 예외 메커니즘을 결합하여 데이터베이스 작업을보다 투명하고 안전하게 만드는 것이 좋습니다.