데이터베이스 작업에 PHP의 MySQLI 확장 기능을 사용하는 경우 repay ()는 특히 전처리 문이 보안 및 성능을 향상시키는 데 사용되는 시나리오에서 핵심 단계입니다. 그러나 일부 개발자는 혼란스러운 문제에 직면합니다. SQL 문은 완전히 올바르게 철자를 맞추지 만 repary ()를 호출 할 때 오류를보고합니다. 이 기사는 mysqli :: stmt_init 함수를 결합 하여이 문제의 일반적인 원인과 문제 해결 방법을 탐색합니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init();
$sql = "SELECT * FROM users WHERE id = ?";
if (!$stmt->prepare($sql)) {
die("전처리가 실패했습니다: " . $stmt->error);
}
SQL 구문이 올바른 경우에도 위의 repay () 는 거짓을 반환하고 오류 메시지를 트리거합니다. 아래에서 항목별로 항목을 분석합니다.
SQL 문은 구문 적으로 정확하지만 데이터베이스에 존재하지 않는 테이블이나 열이 참조되면 일부 MySQL 버전에서는 준비 () 가 실패합니다. 예를 들어:
SELECT * FROM userz WHERE id = ?
userz 테이블이 존재하지 않으면, 구문이 올바른 경우에도 repay ()는 여전히 오류를보고합니다.
솔루션 : SQL의 테이블 이름과 필드 이름이 실제로 데이터베이스에 존재하는지 확인하십시오.
MySQL 사용자는 select , insert 등과 같은 특정 문을 실행하는 데 필요한 권한이 없을 수 있습니다. 구문은 정상이지만 불충분 한 권한은 repary ()가 실패하게됩니다.
솔루션 : 데이터베이스 사용자가 대상 테이블에 대한 해당 조작 권한이 있는지 확인하십시오.
진술이보기를 언급하고 해당보기의 논리에 문제가 있거나 권한이 제한된 개체에 의존하는 경우 read () 오류를 유발할 수도 있습니다.
솔루션 : 관련 뷰 또는 트리거를 확인하여 논리와 권한이 올바른지 확인하십시오.
$ mysqli-> stmt_init () 로 명령문 객체를 초기화 한 후에는 데이터베이스 연결이 만료되었을 수 있지만 여전히 repary ()를 실행하려고 시도합니다.
솔루션 : $ mysqli-> ping ()을 사용하여 연결이 여전히 유효한지 확인하고 필요한 경우 다시 연결하십시오.
mysql repary ()는 다음과 같은 여러 문장을 포함하는 문자열을 지원하지 않습니다.
$sql = "SELECT * FROM users WHERE id = ?; DROP TABLE users;";
SQL에서 구문이 허용되지만 repay () 는 단일 문을 수락합니다.
해결 방법 : SQL 문자열에 하나의 명령문 만 포함되어 있는지 확인하십시오.
이 문제를 디버깅하고 $ stmt-> 오류를 보는 것 외에도 $ mysqli-> 오류를 보거나 자세한 오류 정보를 위해 예외 모드를 활성화 할 수도 있습니다.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
이것은 예외로 오류를 던지고 디버깅에 도움이됩니다.
하드 코딩 된 테이블과 열 이름을 피하고 상수 또는 ORM을 사용하십시오.
외부 입력을 기반으로 SQL 스트링의 직접 구성을 피하고 주입 및 시맨틱 오류를 방지하십시오.
배포 환경에서 SQL 로그를 켜서 실행 세부 정보를 추적하는 데 도움이됩니다.