복붙노트

MySQLi에서 쿼리 오류를 예외로 변환

PHP

MySQLi에서 쿼리 오류를 예외로 변환

MySQLi 쿼리 오류를 Exceptions로 변환하려고 시도하고 있습니다 만, mysqli_sql_exception은 DB 연결에 실패한 경우에만 throw됩니다.

mysqli_report (MYSQLI_REPORT_STRICT)와 프로 시저 MySQLi 함수를 커스텀 래퍼 클래스에 임베드했다.

이전 코드 :

public function mysqlQuery($SQL) {

    $this->Result = mysqli_query($this->DBlink, $SQL);

    if($this->Result === false)
        throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));

    return $this->Result;

}

질문 : 쿼리가 실패 할 때 정상적인 경고 또는 예외가 발생하지 않으므로 mysqli_query ()가 false를 반환했는지 확인해야합니다.

해결법

  1. ==============================

    1.

    얼마 전이 문제를 해결할 수있었습니다. 다른 답변에서 지적했듯이,

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    예외를 throw하도록 mysqli에 지시하는 올바른 방법이다.

    그러나, 만약 여러분이 여러분의 래퍼에 mysqli 함수를 래핑한다면 (모두가 그렇듯이!) 너무 많은 차이를 만들지는 않습니다. 어느 쪽이든 성공 여부를 확인하기 위해 코드를 추가해야합니다. 그러나 전화가 매우 제한적일 것이므로 너무 많은 문제를 일으키지는 않을 것입니다.

    그러나 mysqli에서 mysqli로 모든 이동 열풍으로 "움직이는"사람들은 (그러나 접근법을 동일하게 유지하고 코드 전체에 mysqli 기능을 부여하는)이 설정을 극적으로 활용할 것입니다. 모든 함수 호출을 try-catch로 래핑하는 일반적인 습관은 쓸데없는 일이다).

  2. ==============================

    2.

    아니.

    당신은 당신이 필요로하는 것을 할 수 있어야하고 mysqli 드라이버에게 SQL 에러에 대한 예외를 던지도록 지시해야하지만, 아직 없다면 MYSQLI_REPORT_ERROR를 활성화시켜야한다.

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
    

    mysqli_query ()는 에러시에 예외를 던져야한다. 실패에 대한 반환 값을 확인할 필요가 없습니다 (예외가 발생하기 때문에 어쨌든 발생하지 않음).

    public function mysqlQuery($SQL) {
        try {
            $this->Result = mysqli_query($this->DBlink, $SQL);
        } catch (mysqli_sql_exception $e) {
            throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
        }
        return $this->Result;
    }
    

    (주의 : 다시 throw 된 예외에서 $ this-> SQL을 $ SQL로 변경했습니다.)

  3. ==============================

    3.

    나는 그것이 너무 늦었다는 것을 알고있다. 그러나 후손들을 위해. MYSQLI_REPORT_STRICT가 제한적이기 때문에 특정 예외가 발생하지 않으며 따라서 catch 블록에서 처리 할 수 ​​없습니다.      mysqli_report (MYSQLI_REPORT_ALL); // 모든 mysqli 에러를 트랩한다.  시도 {     $ mysqli = 새로운 mysqli ( 'localhost', 'user,'pwd ','db ');      / * 명시 적으로 예외를 던질 필요가 없습니다.       자동으로 수행 * /  } catch (Exception $ e) {     echo $ e-> getMessage ();  }

  4. from https://stackoverflow.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli by cc-by-sa and MIT lisence