데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때는 종종 보안 및 실행 효율성을 향상시키기 위해 전처리 명세서를 사용합니다. mysqli :: stmt_init () 는 전처리 명령문 개체를 만드는 일반적인 시작점이지만 그러한 상황을 만난 적이 있습니까?
stmt_init () 로 명령문 객체를 초기화했지만, 그 후의 후속 호출 () 는 오류 나 예외없이 조용히 실패했지만 코드는 조용히 "실행"되었지만 데이터베이스 작업이 변경되지 않았습니까?
이 "침묵 실패"문제는 매우 숨겨져 있습니다. 오늘 우리는 일반적인 원인을 분석하고 샘플 코드를 첨부하여 문제를 신속하게 찾을 수 있습니다.
다음과 유사한 코드를 작성했을 수 있습니다.
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM users WHERE email = ?")) {
$email = "example@m66.net";
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$stmt->close();
} else {
echo "진술을 준비하지 못했습니다";
}
$mysqli->close();
?>
괜찮아 보입니다. 그러나 $ stmt-> repay ()가 false를 반환하면 프로그램이 아래쪽으로 실행되지 않으며 명확한 오류 메시지를보고하지 않습니다. 준비가 실패하는 이유조차 모릅니다.
준비 () false를 반환합니다. 실제로 명령문 전처리가 실패했음을 의미하지만 특정 오류 정보를 얻으려면 $ mysqli-> 오류 또는 $ stmt-> 오류를 적극적으로 호출해야합니다.
예를 들어:
if (!$stmt->prepare("SELECT * FROM users WHERE email = ?")) {
die("전처리가 실패했습니다: " . $stmt->error); // 또는 $mysqli->error
}
문자열을 스플 라이스하지 않더라도 정적으로 죽은 SQL을 쓰는 것은 문제가 될 수 있습니다. 예를 들어:
$stmt->prepare("SELECT FROM users WHERE email = ?"); // 누락 된 필드 이름
현재는 repay () 가 거짓을 반환하지만, 특정 이유를보기 위해 오류 출력을 추가하지 않으면 무엇이 잘못되었는지 알 수 없습니다.
repary () 의 반환 값을 항상 확인하고 오류 메시지를 출력하십시오.
if (!$stmt->prepare($sql)) {
die("Prepare 실패하다: " . $stmt->error);
}
손쉬운 디버깅을 위해 오류보고 모드를 켜십시오.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
이 문장을 추가 한 후 MySQLI 오류는 자동으로 예외를 던집니다. 이는 개발 단계에서 문제를 해결하는 데 매우 적합합니다.
체인 전화를 피하십시오 repay ()를 확인한 직후 $ stmt 에서 stmt_init ()를 사용하여 확인하십시오.
$stmt = $mysqli->stmt_init();
if (!$stmt) {
die("stmt_init 실패하다: " . $mysqli->error);
}
후속 repay () 또는 execute () 작업이 실패하지만 mysqli :: stmt_init ()을 사용하여 명령문 객체를 작성한 후 오류가보고되지 않은 경우 $ stmt-> error 및 $ mysqli-> 오류를 수동으로 확인하고 오류보고 모드를 활성화하십시오. 그렇지 않으면 코드 로직의 "환상"에 전혀 존재하지 않는 문제를 확인하는 데 많은 시간을 낭비 할 수 있지만 실제 작업에 실패했습니다.
또한 SQL 문 자체에 구문 오류가 없도록하고 필드 이름이 올바르게 철자를 맞추고 매개 변수 수는 모두 repary () 의 성공을 보장하기위한 전제 조건입니다.