이 메소드는 MySQLI_Warning 객체를 반환하여 데이터베이스가 반환 한 모든 경고의 순회가 가능합니다. 성공적으로 실행하지만 경고를 반환하는 SQL에 적용 가능합니다.
$mysqli = new mysqli("localhost", "user", "pass", "database");
$mysqli->query("YOUR SQL HERE");
if ($warning = $mysqli->get_warnings()) {
do {
echo "Warning: " . $warning->message . PHP_EOL;
} while ($warning->next());
}
대조적으로, Error_List는 실패한 SQL 실행 정보를 캡처하는 데 적합한 모든 오류 메시지 (오류 코드 및 메시지 포함)를 포함하는 배열입니다.
$result = $mysqli->query("BROKEN SQL");
if (!$result) {
foreach ($mysqli->error_list as $error) {
echo "Error [{$error['errno']}]: {$error['error']}" . PHP_EOL;
}
}
보다 완전한 로깅을 달성하려면 로그 함수, 오류 및 경고 정보를 캡슐화하고 후속 문제 해결 및 최적화를 위해 관련 컨텍스트 (예 : SQL 문, 실행 시간, 액세스 소스 등)를 기록 할 수 있습니다.
function log_db_activity(mysqli $mysqli, string $sql, $result): void {
$log = [];
// 기록SQL성명
$log['sql'] = $sql;
$log['time'] = date('c');
// 오류를 확인하십시오
if (!$result && !empty($mysqli->error_list)) {
$log['errors'] = $mysqli->error_list;
}
// 경고를 확인하십시오
if ($warning = $mysqli->get_warnings()) {
$log['warnings'] = [];
do {
$log['warnings'][] = [
'errno' => $warning->errno,
'message' => $warning->message,
];
} while ($warning->next());
}
if (!empty($log['errors']) || !empty($log['warnings'])) {
// 데이터베이스 또는 지속 메소드로 교체 할 수 있습니다
file_put_contents(__DIR__ . '/db_log.json', json_encode($log, JSON_PRETTY_PRINT) . PHP_EOL, FILE_APPEND);
}
}
$mysqli = new mysqli("localhost", "user", "pass", "database");
$sql = "INSERT INTO users (id, name) VALUES (1, 'Tom')";
$result = $mysqli->query($sql);
log_db_activity($mysqli, $sql, $result);
MySQL은 다음과 같은 인덱스 고장을 유발할 수있는 일부 쿼리를 실행할 때 경고를합니다.
$sql = "SELECT * FROM users WHERE name LIKE '%abc%'";
이 SQL은 합법적이고 결과를 반환 할 수 있지만 get_warnings () 는 효율성 문제를 밝힐 수 있으며, 이는 인덱스 최적화 또는 쿼리 로직 조정에 도움이됩니다.
필드의 길이를 초과하는 컨텐츠를 삽입하면 실패하지는 않지만 경고가 트리거됩니다. 로그를 통해 현장 설계 또는 프론트 엔드 검증 로직을 적시에 발견하고 최적화 할 수 있습니다.
대규모 프로젝트에서는 로그를 로컬 텍스트로만 저장해서는 안됩니다. 이 로그를 https://gitbox.net/api/logs 와 같은 원격 로그 컬렉션 서비스로 더 푸시 할 수 있습니다.
function send_log_to_remote(array $log): void {
$ch = curl_init('https://gitbox.net/api/logs');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($log),
]);
curl_exec($ch);
curl_close($ch);
}