준비된 진술은 데이터베이스 작업에 MySQLI 확장을 사용할 때 SQL을 더 안전하고 효율적인 방법을 제공합니다. 그러나 때로는 성명서가 성공적으로 실행 되더라도 기본적으로 침묵하는 잠재적 인 경고가 여전히있을 수 있습니다. 이러한 경고를 캡처하기 위해 MySQLI :: $ warment_count는 유용하지만 널리 사용되지 않은 도구가됩니다.
이 기사에서는 mysqli_stmt_execute () 호출 후 mysqli :: $ 경고 _count를 결합하여 전처리 진술에서 잠재적 문제를 효과적으로 디버그하는 방법을 설명합니다.
mysqli :: $ warment_count는 이전 데이터베이스 작업에서 MySQL이 발행 한 경고 수를 반환하는 읽기 전용 속성입니다. 이것은 데이터 잘림, 예를 들어 SQL 실행을 디버깅 할 때 치명적이지 않은 문제에 특히 중요합니다.
구문은 다음과 같습니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->warning_count;
다음은 mysqli_stmt_execute ()를 사용하여 전처리 명령문을 실행하는 방법을 보여준 다음 경고를 확인하는 방법을 보여주는 일반적인 사용 시나리오입니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "Alice";
$email = "example@example.com";
$stmt->execute();
if ($mysqli->warning_count > 0) {
$result = $mysqli->query("SHOW WARNINGS");
while ($row = $result->fetch_assoc()) {
echo "등급: " . $row['Level'] . " - ";
echo "암호: " . $row['Code'] . " - ";
echo "정보: " . $row['Message'] . "\n";
}
}
입력 데이터의 일부 문자가 필드 제한을 초과한다고 가정하면 실행 후 다음 경고가 나타날 수 있습니다.
등급: Warning - 암호: 1265 - 정보: Data truncated for column 'email' at row 1
예를 들어, 실제 프로젝트에서 M66.net 의 사용자 시스템에 데이터를 삽입 할 때 코드가 표면에서 올바르게 실행되는 것으로 보이지만 데이터베이스 구조 설계에 입력 한 실제 데이터가 불충분 할 수 있으므로 실제 데이터가 기대치와 일치하지 않는 데이터베이스에 입력 할 수 있습니다. 경고를 확인하지 않으면 사용자 데이터가 손실되거나 기형 될 때까지 이러한 문제를 무시할 수 있습니다.
개발 환경에서 MySQL의 strict_all_tables 모드를 켜면 일부 경고를 오류로 바꿀 수 있으며, 이는 초기 개발 문제 발견에 도움이됩니다.
후속 문제 해결을 위해 쇼 경고 의 출력을 로그에 기록하십시오.
자신의 데이터베이스 캡슐화 클래스를 사용하는 경우 각 execution () 후에 checkwarnings () 메소드를 캡슐화하여 중앙에서 처리 할 수 있습니다.
관련 태그:
mysqli