데이터베이스 작업에 PHP의 MySQLI Extension을 사용할 때는 일반적으로 쿼리가 성공했는지 여부와 오류가 발생했는지 여부에주의를 기울이지 만 종종 무시되는 상황이 있습니다. 이러한 경고가 구체적으로 다루지 않으면 현장 자르기, 기본값 대체 등과 같은 잠재적 인 문제를 숨길 수 있습니다.이 기사는 MySQLI :: Query () 및 MySQLI :: get_warnings ()를 사용하여 이러한 경고를 포착하고 모범 사례를 제공하는 방법을 공유합니다.
다음과 같은 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 ()는 이전 작업에서 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 품질에 대한 피드백도 제공합니다.
get_warnings ()는 마지막 쿼리에만 작동합니다.
링크 된 목록과 유사한 객체를 반환하고 다음 () 에 의해 통과합니다.
모든 드라이버가 경고를 완전히 지원하는 것은 아니며 사용하기 전에 데이터베이스 구성을 테스트해야합니다.
mysqli_report ()는 get_warnings ()를 대체 할 수 없으며, 전자는 오류에 더 많은주의를 기울입니다.
준비 문장 ( 준비 )을 사용하여 매개 변수를 바인딩 할 때와 같이 경고를 시작하고 경고를받습니다.
생산 경고를 요약하고 정기적으로보고 할 수 있으며, 데이터베이스 어시스턴트 클래스를 캡슐화하여 수행 할 수 있습니다.
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 ()는 데이터 무결성을 보장하는 중요한 보충제입니다. 이러한 경고 메시지를 무시하지 마십시오. 종종 미래의 버그를 숨 깁니다. 개발 또는 테스트 환경에서 경고를 포착하고 취급하는 습관을 개발하면 프로젝트의 견고성과 유지 가능성을 크게 향상시킬 수 있습니다.
기억하십시오 : 오류로 인해 프로그램이 소멸되면 경고로 인해 트랩이 손실됩니다.