mysqli_fetch_assoc ()는 매개 변수 / 멤버 함수 호출 bind_param () 오류를 예상합니다. 실제 mysql 오류를 얻고 수정하는 방법은 무엇입니까?


109

내 로컬 / 개발 환경에서 MySQLi 쿼리가 정상적으로 수행되고 있습니다. 그러나 웹 호스트 환경에 업로드하면 다음 오류가 발생합니다.

치명적 오류 : 비 객체의 bind_param () 멤버 함수 호출 ...

다음은 코드입니다.

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

내 쿼리를 확인하기 위해 제어판 phpMyAdmin을 통해 쿼리를 실행하려고했는데 결과는 정상입니다.


$mysqli변수 를 시작하는 위치를 볼 수 있습니까 ?
Rikesh

MySQL 사용자에게 SELECT쿼리 를 수행 할 권한이 없을 수 있습니다 . 확인 했어?
Amal Murali 2014 년

떠오르는 것은 사용 가능한 mysqli가 없거나 MySQL에 연결하기 위해 잘못된 자격 증명을 제공했다는 것입니다.
NB

@YourCommonSense-이전 제목으로 중복 참조를 위해이 질문을 찾는 것이 더 간단했습니다.
Paul Spiegel

@Paul 예, 이것은 내 가장 깊은 관심사이기도합니다. 평균적인 PHP 사용자의 경우 코드와 다른 환경 간의 연결이 명확하지 않기 때문에 Google 검색 및 전반적인 인식을 위해 제목을 변경했습니다. 그러나 그 이후로 나도 그것을 찾는 데 어려움을 겪고 있습니다. 결국 북마크에 넣으십시오. 당신이 인식 할 수 있지만 해당 제목을 제안 할 수 있다면, 그것은 좋은 것입니다
당신의 상식

답변:


122

때로는 MySQLi 코드가 mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...또는 이와 유사한 오류를 생성합니다 . 또는 오류 없이도 쿼리가 모두 동일하게 작동하지 않습니다. 쿼리를 실행하지 못했음을 의미합니다.

쿼리가 실패 할 때마다 MySQL에는 이유를 설명하는 오류 메시지가 표시 됩니다. 불행히도 기본적으로 이러한 오류는 PHP로 전송되지 않으며 위에서 언급 한 비밀스러운 오류 메시지 만 있습니다. 따라서 MySQL 오류를보고하도록 PHP와 MySQLi를 구성하는 것이 매우 중요합니다. 오류 메시지가 표시되면 문제를 해결하는 것이 좋습니다.

MySQLi에서 오류 메시지를 얻는 방법은 무엇입니까?

우선, MySQLi가 모든 환경 에서 연결되기 전에 항상 다음 줄을 사용 하십시오.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

그 후 모든 MySQL 오류는 PHP 예외로 전송됩니다. 잡히지 않은 예외는 차례로 PHP 치명적인 오류를 만듭니다. 따라서 MySQL 오류의 경우 일반적인 PHP 오류가 발생합니다. 그러면 오류 원인을 즉시 알 수 있습니다. 스택 추적을 통해 오류가 발생한 정확한 지점을 찾을 수 있습니다.

다양한 환경에서 PHP를 구성하는 방법

여기에 내 글의 요지입니다 PHP 오류보고 :
개발 및 라이브 서버에서 오류를보고하는 것은 달라야은. 개발 서버에서는 오류를 화면에 표시하는 것이 편리하지만 라이브 서버에서는 오류 메시지를 대신 기록해야하므로 나중에 오류 로그에서 찾을 수 있습니다.

따라서 해당 구성 옵션을 다음 값으로 설정해야합니다.

  • 개발 서버에서

    • error_reportingE_ALL값 으로 설정해야 합니다.
    • log_errors 1로 설정해야합니다 (개발 PC에서도 로그를 보유하는 것이 편리합니다).
    • display_errors 1로 설정해야합니다.
  • 프로덕션 서버에서

    • error_reportingE_ALL값 으로 설정해야 합니다.
    • log_errors 1로 설정해야합니다.
    • display_errors 0으로 설정해야합니다.

실제로 사용하는 방법?

그냥 모든 코드를 제거하는 수동으로 오류를 검사 , 모든 or die(), if ($result)등. 즉시 데이터베이스 상호 작용 코드를 작성하면됩니다.

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

또, 주변에 어떤 조건없이 . 오류가 발생하면 코드에서 다른 오류로 처리됩니다. 예를 들어 개발 용 PC에서는 화면에만 표시되고 라이브 사이트에서는 프로그래머 용으로 기록되는 반면 사용자의 편의를 위해 오류 처리기를 사용할 수 있습니다 (그러나 이는 주제에서 벗어난 다른 이야기입니다. MySQLi,하지만 위에 링크 된 기사에서 읽을 수 있습니다.)

표시되는 오류 메시지를 어떻게 처리합니까?

우선 문제 쿼리를 찾아야합니다. 오류 메시지에는 오류가 발생한 정확한 지점 의 파일 이름과 줄 번호 가 포함됩니다. 충분하지만 코드가 함수 나 클래스를 사용하는 경우 스택 추적 을 따라 문제 쿼리를 찾아야 할 수 있습니다.

오류 메시지를받은 후에는 읽고 이해해야합니다. 당연하지 않더라도 너무 당연하게 들리지만, 학습자들은 오류 메시지가 단순한 경보 신호가 아니라 실제로 문제에 대한 자세한 설명이 포함되어 있다는 사실을 간과하는 경우가 많습니다 . 그리고 필요한 것은 오류 메시지를 읽고 문제를 해결하는 것입니다.

  • 특정 테이블이 존재하지 않는다고 표시되면 맞춤법, 오타, 대소 문자를 확인해야합니다. 또한 PHP 스크립트가 올바른 데이터베이스에 연결되어 있는지 확인해야합니다.
  • 또는 SQL 구문에 오류가 있다고 표시되면 SQL을 검사해야합니다. 그리고 문제 지점은 오류 메시지에 인용 된 쿼리 부분 바로 앞에 있습니다.

오류 메시지를 이해하지 못하는 경우 Google에 시도해보십시오. 그리고 결과를 탐색 할 때 솔직하게 해결책을 제시하기보다는 오류 를 설명 하는 답변을 고수 하십시오. 특정 경우에 솔루션이 작동하지 않을 수 있지만 설명을 통해 문제를 이해하고 직접 문제를 해결할 수 있습니다.

또한 오류 메시지를 신뢰 해야합니다. 이 토큰의 수는 바운드 변수의 수와 일치하지 않는다고 말한다면 그것은 이다 그래서. 없는 테이블이나 열도 마찬가지입니다. 자신의 실수 든 오류 메시지 든 선택이 주어지면 항상 전자를 고수하십시오. 다시 말하지만,이 사이트에 대한 수백 개의 질문은이 조언이 매우 유용하다는 것을 증명합니다.

오류보고와 관련하여 절대하지 말아야 할 일 목록

  • 오류 억제 연산자 ( @)를 사용하지 마십시오 ! 프로그래머가 오류 메시지를 읽을 수 없으므로 오류를 수정할 수 없습니다.
  • die()또는 echo또는 다른 기능을 사용하여 무조건 화면에 오류 메시지를 인쇄 하지 마십시오 . PHP는 자체적으로 오류를보고 할 수 있으며 환경에 따라 올바른 방식으로 수행 할 수 있으므로 PHP에 맡기십시오.
  • 쿼리 결과를 수동으로 테스트하는 조건을 추가하지 마십시오 (예 if($result):). 오류 예외가 활성화되면 이러한 조건은 쓸모가 없습니다.
  • try..catch오류 메시지를 에코하기 위해 연산자를 사용하지 마십시오 . 이 연산자는 트랜잭션 롤백과 같은 오류 처리를 수행하는 데 사용해야합니다. 그러나 오류를보고하는 데만 사용해서는 안됩니다. 위에서 배운 것처럼 PHP는 이미 올바른 방법으로 할 수 있습니다.

추신
때때로 오류는 없지만 결과도 없습니다. 그러면 기준과 일치하는 데이터가 데이터베이스에 없습니다 . 이 경우 데이터를 맹세 할 수 있고 기준이 옳다고해도이 사실을 인정해야합니다. 그렇지 않습니다. 다시 확인해야합니다. 이 문제에 도움이 될 수있는 문서 인 데이터베이스 상호 작용을 디버그하는 방법 이 있습니다 . PDO 용으로 작성되었지만 원칙은 동일합니다. 이 지침을 단계별로 따르고 문제를 해결하거나 Stack Overflow에 대한 답변 가능한 질문이 있습니다.


@를 사용하는 @AdamWinter는 항상 잘못되었으며,이 특별한 경우에는 10 배입니다. 프로그램에 대한 오류 메시지는 신체의 통증과 동일합니다. 다리가 부러진 것처럼 뭔가 잘못되었음을 알려줍니다. 그리고 당신은 진통제를 복용하고 계속해서 다리를 고쳐야합니다. 여기도 마찬가지입니다. PHP는 예상되는 변수가 없다고 알려줍니다. 따라서이 변수를 사용 가능하게하려면 양식 등을 수정해야합니다. 오류를 피하는 코드를 작성하는 것만이 아닙니다.
당신의 상식
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.