mysqli :: get_warnings는 가장 최근의 MySQL 작업에서 경고를 생성하는 데 사용됩니다. 오류와 비교할 때 경고는 종종 SQL 문의 실행에 영향을 미치지 않지만 데이터 예외, 성능 문제 또는 잠재적 논리적 결함을 숨길 수 있습니다.
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
die("연결이 실패했습니다:" . $mysqli->connect_error);
}
$result = $mysqli->query("YOUR SQL QUERY");
if ($result) {
if ($warnings = $mysqli->get_warnings()) {
do {
echo "경고 코드: " . $warnings->errno . " - " . $warnings->message . "\n";
} while ($warnings->next());
}
}
이러한 경고를 합리적으로 포착하고 처리하면 숨겨진 위험의 축적을 방지 할 수 있습니다.
정적 분석 도구 (예 : PHPSTAN, PSALM)는 일반적으로 코드에서 유형 오류, 잠재적 예외 및 사용하지 않는 변수를 확인하지만 기본적으로 런타임에 생성 된 데이터베이스 경고에주의를 기울이지 않습니다. get_warnings는 복잡한 객체를 반환하기 때문에 이러한 경고가 잘 확인되어 코드에서 사용되지 않으면 다음과 같은 위험이있을 수 있습니다.
경고는 검사되지 않아 잠재적 위험이 무시됩니다.
경고 객체는 올바르게 가로 지르거나 릴리스되지 않습니다.
get_warnings 결과는 잘못 사용되거나 무시됩니다.
일부 정적 분석 도구는 사용자 정의 규칙을 지원합니다. 플러그인을 작성하여 다음과 같은 일반적인 문제를 감지 할 수 있습니다.
각 쿼리가 실행 된 후 get_warnings가 호출되는지 여부.
get_warnings 에 의해 반환 된 물체가 가로지고 기록되었는지 여부.
경고 객체의 반환이 무시되는 상황이 있습니까?
예를 들어, phpstan의 경우 get_warnings 에 대한 호출과 mysqli :: query 에 대한 호출이 이어지는 지 확인하기위한 규칙을 정의 할 수 있습니다.
모든 데이터베이스 작업이 경고를 명시 적으로 처리하도록 요구하는 팀 코드 사양을 개발합니다.
SQL 문을 실행 한 후 $ mysqli-> get_warnings ()를 호출하십시오.
반복 및 출력 또는 로그 경고.
무시할 수없는 경고의 경우 예외를 제외하거나 중요한 오류를 기록하십시오.
단위 테스트가 데이터베이스를 시뮬레이션하여 경고를 생성하는 시나리오를 작성하고 코드가 올바르게 캡처되어 처리되었는지 확인하십시오.
// 샘플 데이터베이스 경고 테스트 예제
class DatabaseWarningTest extends \PHPUnit\Framework\TestCase
{
public function testGetWarningsHandled()
{
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
$mysqli->query("YOUR SQL QUERY THAT CAUSES WARNING");
$warnings = $mysqli->get_warnings();
$this->assertNotNull($warnings, '경고를 포착해야합니다');
while ($warnings) {
$this->assertIsInt($warnings->errno);
$this->assertIsString($warnings->message);
$warnings = $warnings->next();
}
}
}
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
die("연결이 실패했습니다:" . $mysqli->connect_error);
}
$query = "INSERT INTO users (name, email) VALUES ('장 산', '[email protected]')";
$result = $mysqli->query($query);
if ($result === false) {
// 처리 오류
echo "SQL실수:" . $mysqli->error;
} else {
$warnings = $mysqli->get_warnings();
if ($warnings) {
do {
// 기록 경고 정보,또는 프로젝트 요구 사항에 따라 처리하십시오
error_log("数据库경고 코드: {$warnings->errno}, 정보: {$warnings->message}");
} while ($warnings->next());
}
echo "운영이 성공적입니다,그리고 경고가 처리되었습니다";
}
mysqli :: get_warnings를 정적 분석 프로세스에 통합하는 것은 모든 데이터베이스 작업 경고가 올바르게 캡처되고 처리되도록하는 주요 목적입니다. 정적 분석 규칙을 사용자 정의하고 팀 사양을 강화하고 단위 테스트를 개선함으로써 코드 품질을 크게 향상시킬 수 있으며 숨겨진 위험을 줄일 수 있습니다. 좋은 예외 처리 및 로깅을 결합한 개발자는 데이터베이스 상호 작용 코드를보다 침착하게 유지하여 경고를 무시함으로써 발생하는 잠재적 인 문제를 피할 수 있습니다.