2012-01-26 7 views
0

내 DB2 클래스가 준비 기능이 경고 생성 : 일부 신비 쿼리의 PHP 오류 로그에서 경고를 일으키는캐치 db2_prepare는

public function prepare() 
{ 
    if (FALSE === ($this->stmt = db2_prepare($this->conn, $this->sql))) 
    { 
     throw new Exception($this->get_error()); 
    } 

    return $this; 
} 

:

[26-Jan-2012 11:17:32] PHP Warning: db2_prepare(): Statement Prepare Failed in /<path to file>/Db2.php on line 178 

db2_prepare가 FALSE 반환하지 않습니다. 그렇지 않으면 예외가 발생하고 백 트레이스가 발생합니다.

합법적 인 오류/경고를 캐치하기 위해 db2_prepare의 리턴 값을 적절하게 테스트하지 않거나 db2_prepare에 버그가 있습니까?

이것은 i5/iseries/as400의 Zend Server 스택에서 실행 중입니다.

이 상황의 해결 방법은 경고에 대한 예외를 생성하는 try catch 블록입니다. 그것이 어떻게 작동 될지 확신하지 못했고, 그것은 나에게 또 다른 포스트처럼 들린다.

또한 @는 옵션이 아닙니다. 그것은 이유에 대한 경고를 생성합니다. 나는 머리를 모래에 붙이지 않는 것을 선호한다.

업데이트 : 마지막으로 쿼리를 추적했습니다. 그것은 심하게 형성된 insert 문이었습니다. 준비가 실패하고 오류가 생성되었지만 유효한 명령문 자원이 리턴되었고 스크립트는 계속 예외를 생성합니다. exec를 사용하여 잘못된 INSERT가 포함 된 스크립트를 호출했지만 스크립트의 결과를 반환하지 않았으므로 오류가 발생하지 않았습니다.

여전히 나에게는 버그가있는 것처럼 보이지만 더 이상 추구 할 시간이 없습니다.

+0

FALSE를 반환하지 않는다는 것을 말하고 있지만 반환되는 것은 무엇입니까? – netcoder

+0

글쎄, 어떻게 찾아야할지 모르겠다. $ this-> stmt를 var_dump 할 수는 있지만 오류를 일으키는 스크립트는 많은 쿼리를 실행하며 경고를 생성하는 경로를 추적하는 방법을 모르겠습니다. 지금은 사용자 정의 오류 처리기를 사용하여 E_WARNING에 백 트레이스를 생성하는 방법을 파악하려고합니다. –

+0

잘못된 쿼리를 찾았습니다. 유효한 명령문 리소스를 반환하고 있지만 준비가 실패합니다. –

답변

1

반환을 확인할 때 준비가 성공적인 자원을 반환했는지 여부 대신 SQLSTATE을 비교하려고합니다.

PHP에서 db2_stmt_error()을 사용하여 SQLSTATE를 검색 할 수 있습니다. 특정 상태 (마지막으로 실행 한 특정 리소스)를 SQL 실행 상태로 볼 수 있습니다. 나는 당신이 PREPARE에서 돌아가고 싶은 유일한 SQLSTATE가 00000이 될 것이라고 믿는다. 이것은 성공적인 실행을위한 코드이다.

사람이 읽을 수있는 SQL 오류 메시지를 출력하려면 db2_stmt_errormsg()을 사용하면 SQLSTATE와 해당 오류 메시지 문자열이 출력됩니다.

+0

내 환경에서 답을 확인하기 위해 몇 가지 테스트를하고 싶지만이 방법이 훨씬 더 좋은 솔루션이라고 할 수 있습니다. 감사. –