2017-09-10 8 views
0

prepared statement가있는 다음 PHP 코드에서 의도적으로 bind_param을 테스트하고 execute에 $ bikes를 추가하는 중 오류가 발생했습니다.Prepared statements 및 bind_param 오류 처리

실행 함수에서 오류 정보가 반환됩니다. 그러나 bind_param에서 오류가 발생하더라도 오류 정보는 반환하지 않습니다.

bind_param에서 오류 정보를 얻는 방법은 무엇입니까?

$sqlQuery = "INSERT INTO the_cars (cars) VALUES (?)"; 

if($statement = $con->prepare($sqlQuery)){ 

    if(!$statement->bind_param("s", $cars, $bikes)){ //bikes should not be here 
     $errors = $statement->error; //error is empty 
    }; 

    if(!$statement->execute()){ 
     $errors1 = $statement->error; // error: No data supplied for parameters in prepared statement 
    }; 

}else{  
    $errors = $con->error; 
} 

편집 :

PHP 매뉴얼은 bind_param에 오류가 처리되어야 함을 제안하는 것 같다. 이것은 또한 위치가 주창 것 같다 */

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

을 바인드 및 실행 : 여러 번»/ * 준비된 문, 2 단계를 실행, 3 INSERT 한 번 준비 예 번호 : 텍스트의 다음 부분을 참조하십시오 몇몇 포스트에서. 예를 들어 :

MySQLi prepared statements error reporting

그러나, 나는 몇 가지 시도를했고, 나는 bind_param에 문 오류에 대한 설명을 얻을 수 결코 없었다.

+0

직접 확인해야한다고 생각합니다. – Sysix

답변

2

아직 실행되지 않은 항목에서 오류가 발생하거나 얻을 수 없으므로 두 번째 조건문은 오류를 발생시키지 않습니다. 실행이 성공했는지와 bind_param() 메소드가 아닌지 확인해야합니다.

그런 다음 세 번째 (조건문)는 이론적으로 유효한 (쿼리) 문으로 간주 될 쿼리에 있기 때문에 이론적으로 오류가 발생하지 않습니다.

if(!$statement) 문을 바인드에서 제거하려면 이지만 실행 부분에을 유지해야합니다.

그러면 오류가 발생합니다.

if($statement = $con->prepare($sqlQuery))에 대한 첫 번째 조건문이 유효하므로 else은 실행되지 않았으므로 오류를 발생시키지 않습니다.

오류를 제대로 확인/조회하는 방법에 대한 PHP.net에서 다음 참조 설명서를 참조하고, 처음에 오류가 발생하는 것은 아니다 있었는지 재발견하려고하지 않습니다

는, 에러 처리가 아닌 결합의 쿼리 (및 실행)에서 수행된다.

bind_param()에 설명서를 참조하십시오 : 언급 또는 방법에 오류 처리의 예

없습니다.

+0

감사합니다. Fred. 나는 코멘트에 모든 것을 쓸 수 없었기 때문에 나는 내 글을 편집했다. 내 질문은 bind_param에 집중되어있다. 모든 것은 당신의 의견이 옳다는 의미에서 지적합니다 (제가 동의하는 견해). 즉, statement_error가 실행 된 후에 만 ​​bind_param을 실행할 때 오류가 발생할 수 있지만 연결 오류를 반환하고 execute 문을 반환합니다. – josei

+0

당신은 환영합니다 @josei 제가 궁금한데 왜 바인딩이 먼저 실패했는지 확인하고 싶습니다. 편집에 포함 된 링크는 https://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting입니다. 맞습니다. 먼저 두 변수에 값이 포함되어 있는지 확인해야합니다. 그렇지 않으면 준비를하거나 바인딩을 시도하지 마십시오. 내가 게시 한 원래 답변은 당신이 집중해야 할 것이고 바인딩과 관련이없는 것은 아닙니다. 항상 '존재'와 'i'또는 's' 또는 기타와 같은 올바른 바인드 매개 변수입니다. –

+0

동의합니다. 나는 준비된 진술의 오류를 다루어야한다는 것을 확신했다. 즉, 준비하고 실행하십시오. 위의 링크로 인해 bind_param에서 발생할 수있는 특정 오류가 있는지 잘 볼 수 없었는지 궁금합니다. 그것이 내 게시물의 이유 중 하나입니다. 귀하의 의견은 준비된 진술의 오류를 적절하게 다루는 방법을보다 분명히하는 데 도움이됩니다. 다시 한번 감사드립니다. – josei