PHP를 사용하여 MySQL 데이터베이스를 연결하고 조작 할 때 MySQLI 확장은 SQL을 실행하기 위해 mysqli :: query , mysqli :: repay 등과 같은 풍부한 방법을 제공합니다. 그러나 실제 개발에서 SQL의 성공 여부에주의를 기울일뿐만 아니라 때로는 실행 프로세스를 얻어야합니다. 이러한 경고로 인해 SQL 실행이 실패하지는 않지만 잠재적 인 문제를 숨 깁니다.
PHP의 mysqli :: get_warnings 메소드는 연결의 마지막 작업에 의해 생성 된 모든 경고를 얻을 수 있습니다. 그러나 사용은 종종 단편화되며 모듈로 마무리 할 수 있다면 프로젝트에서 쉽게 재사용하고 코드를 깔끔하게 유지할 수 있습니다.
이 기사에서는 mysqli :: get_warnings를 재사용 가능한 MySQL 경고 캡처 모듈로 캡슐화하는 방법을 설명합니다.
mysqli :: get_warnings () 메소드는 모든 경고 정보에 액세스 할 수있는 mysqli_warning 객체의 링크 된 목록에 대한 참조를 반환합니다. 각 mysqli_warning 객체에는 다음 정보가 포함되어 있습니다.
메시지 : 경고 메시지
sqlstate : sqlstate 오류 코드
Errno : MySQL 오류 코드
우리의 목표는 다음을 수행 할 수있는 경고 컬렉터 클래스를 구현하는 것입니다.
mysqli 인스턴스에 바인딩;
SQL 문을 실행하고 자동으로 경고 정보를 수집합니다.
경고 정보를 형식화하고 로그로 반환하십시오.
다음 작업에 영향을 미치기 위해 경고 정보를 피하기위한 경고 청소 방법을 제공하십시오.
다음은 완전한 구현 코드입니다.
<?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);
}
}
}
}
이 모듈을 사용하는 것은 매우 간단합니다. 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());
}
이 캡슐화는 다음과 같은 범주의 프로젝트에서 특히 유용합니다.
데이터 마이그레이션 스크립트 : 경고는 현장 자리 또는 유형 불일치를 나타낼 수 있습니다.
배치 가져 오기 도구 : 큰 배치의 데이터를 삽입 할 때 제약 관련 경고가 쉽게 트리거됩니다.
데이터 품질 모니터링 : 나중에 분석을 위해 로그 시스템을 통한 중앙 집중식 경고 수집;
Laravel, Symfony 등과 같은 프레임 워크를 사용하는 경우 종속성 주입에 대한이 아이디어를 기반으로 미들웨어 또는 서비스 클래스로 캡슐화 할 수도 있습니다.
mysqli :: get_warnings ()는 마지막 작업에 의해 발생하는 경고 만 얻을 수 있으므로 각 SQL 실행 직후에 즉시 호출하십시오.
준비된 진술을 사용하는 경우 경고를 받기 전에 실행하는 것이 좋습니다.
다른 MySQL 버전은 경고에 대한 지원 수준이 약간 다릅니다. 개발 및 생산 환경 버전은 일관되게하는 것이 좋습니다.
mysqli :: get_warnings를 모듈로 캡슐화함으로써 우리는 SQL 경고를보다 쉽게 캡처하고 처리 할뿐만 아니라 시스템의 유지 관리 및 견고성을 향상시키는 데 도움이됩니다. 로그 채널 지원 추가, 경고 레벨 필터링 등과 같은 프로젝트 구조에 따라 더 확장 할 수 있습니다.
전체 프로젝트 예는 다음을 참조하십시오.
https://gitbox.net/example/mysql-warning-collector