MySQLI_STMT를 사용하여 PHP에서 SQL 쿼리를 실행할 때 MySQLI_STMT :: $ 오류에서 오류가 발생하지만 SQL 문 자체는 문제가되지 않는 것 같습니다. SQL 문이 정확해 보이기 때문에이 문제는 종종 개발자에게 혼란 스럽지만 PHP는 오류를보고합니다. 오늘날 우리는 5 가지 일반적인 함정과 원인을 분석 할 것입니다.
SQL 쿼리를 실행할 때, 특히 MySQLI_STMT를 사용할 때 SQL 구문이 MySQL 요구 사항을 완전히 준수하지 않으면 MySQL은 일반적으로 오류를 반환합니다. SQL 명령문은 올바른 것처럼 보이지만 일부 암시 적 문자 (예 : 추가 공백 또는 신생)로 인해 SQL 문이 올바르게 구문 분석되기 때문에 오류가 발생할 수 있습니다.
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $username);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error;
}
이 시점에서 SQL 문이 표면에서 올바른 것으로 보이더라도 숨겨진 구문 문제 (예 : 추가 공간 또는 잘못된 분리기)로 인해 MySQL이 오류를보고 할 수 있습니다.
MySQLI_STMT :: $ 오류 의 오류가 표시되면 문제의 근본 원인이 SQL 문 자체가 아니라 데이터베이스 연결에있을 수 있습니다. 데이터베이스 서버가 다운되었거나 네트워크가 중단되어 PHP가 데이터베이스에 올바르게 연결되지 않을 수 있습니다.
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
쿼리를 실행하기 전에 데이터베이스 연결이 성공적인지 확인하십시오. 연결이 실패하면 SQL 문에 문제가없는 경우에도 MySQLI_STMT :: $ 오류가 오류를보고합니다.
MySQLI_STMT를 사용할 때는 종종 SQL 쿼리의 자리 표시 자에게 변수를 바인딩해야합니다. 잘못된 파라미터 바인딩으로 인해 SQL 문이 실패 할 수 있습니다. 예를 들어, 잘못된 매개 변수 유형 (예 : 정수를 문자열로 바인딩)을 바인딩하거나 매개 변수 수가 SQL 자리 표시 자와 일치하지 않으면 오류가 트리거됩니다.
$sql = "SELECT * FROM users WHERE age > ?";
$stmt = $mysqli->prepare($sql);
$age = "30"; // 잘못된 매개 변수 유형,정수 여야합니다
$stmt->bind_param('i', $age);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error;
}
이 예에서 $ Age 변수는 문자열 유형 ( 's' )에 잘못된 반면 SQL 문은 정수 유형 ( 'i' )을 기대합니다. 이 유형 불일치로 인해 SQL 실행이 실패합니다.
쿼리를 실행하고 결과 세트를 얻으려면 쿼리 후 결과 세트를 올바르게 처리하는 것을 잊을 수 있습니다. 특히 Select Query를 사용할 때는 BIND_RESULT () 또는 이와 유사한 작업이 부족하면 오류가 발생합니다.
$sql = "SELECT * FROM users WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
결과 세트를 올바르게 바인딩하거나 Fetch () 함수를 올바르게 호출하지 않으면 SQL 문 자체가 문제가되지는 않지만 MySQLI_STMT :: $ 오류 함수에서 오류가 발생할 수 있습니다.
MySQL의 다른 버전은 다른 SQL 기능을 지원합니다. SQL 문에서 현재 데이터베이스 버전에서 지원되지 않는 기능을 사용하거나 데이터베이스 버전이 너무 오래된 경우 쿼리 오류가 발생할 수도 있습니다.
$sql = "CREATE TABLE IF NOT EXISTS new_table (id INT PRIMARY KEY)";
$stmt = $mysqli->prepare($sql);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error;
}
일부 이전 MySQL 버전에서는 존재하지 않으면 구문이 완전히 지원되지 않거나 구문이 다를 수있어 실행 실패가 발생할 수 있습니다.
mysqli_stmt :: $ error를 사용하는 데 문제가있는 경우 SQL 문에 오류가없는 것 같습니다. SQL 문 자체를 부정하기 위해 서두르지 마십시오. 위에서 언급 한 잠재적 문제를 확인하십시오 : 데이터베이스 연결, 매개 변수 바인딩, 쿼리 결과 처리 등.
여전히 문제를 찾을 수없는 경우 MySQLI_ERROR () 및 MYSQLI_STMT :: $ 오류 에서 더 많은 오류 정보를 보거나 디버깅 도구를 통해 문제의 근본 원인을 추가로 분석 할 수 있습니다.