본문 바로가기
php

[PHP] mysqli error / exception 처리 #mysqli_report

by bryan.oh 2021. 1. 9.
반응형

MySQL Error 처리
mysqli_report

 

error 를 report 하도록 설정해야 합니다. 
개발 시 Debug 용으로는 report 하도록 하고 Release 에서는 report 하지 않거나 file log 를 씁니다. 

mysqli_report 의 기본값은 MYSQLI_REPORT_OFF 입니다.

/* activate reporting */
mysqli_report(MYSQLI_REPORT_ALL);

Supported flagsNameDescription

MYSQLI_REPORT_OFF Turns reporting off (the default)
MYSQLI_REPORT_ERROR Report errors from mysqli function calls
MYSQLI_REPORT_STRICT Throw mysqli_sql_exception for errors instead of warnings
MYSQLI_REPORT_INDEX Report if no index or bad index was used in a query
MYSQLI_REPORT_ALL Set all options (report all)
  /* activate reporting */
  mysqli_report(MYSQLI_REPORT_ALL);

  $stmt = $conn->prepare("INSERT INTO tb_user (userId, userAge) VALUES (?, ?)");
  if ( false===$stmt ) {
   die('prepare() failed: ' . htmlspecialchars($conn->error));
  }
  $rc = $stmt->bind_param("si", $_POST['id'], $_POST['age']);
  if ( false===$rc ) {
    die('bind_param() failed: ' . htmlspecialchars($stmt->error));
  }
  $rc = $stmt->execute();
  if ( false===$rc ) {
    die('execute() failed: ' . htmlspecialchars($stmt->error));
  }
  $stmt->close();

tb_user 라는 테이블에 userAge 라는 컬럼이 없다고 가정하면

MYSQLI_REPORT_ALL 일 경우

Fatal error: Uncaught mysqli_sql_exception: Unknown column 'userAge' in 'field list' in C:\dev\SuperAdmin\test.php:9 Stack trace: #0 C:\dev\SuperAdmin\test.php(9): mysqli->prepare('INSERT INTO tb_...') #1 {main} thrown in C:\dev\SuperAdmin\test.php on line 9
: try catch 있을 경우 잡힘.
MYSQLI_REPORT_ERROR 일 경우

Warning: mysqli::prepare(): (42S22/1054): Unknown column 'userAge' in 'field list' in C:\dev\SuperAdmin\test.php on line 9
prepare() failed: Unknown column 'userAge' in 'field list'
: try catch 안 잡힘.
MYSQLI_REPORT_INDEX 또는 MYSQLI_REPORT_OFF 또는 MYSQLI_REPORT_STRICT 일 경우

prepare() failed: Unknown column 'userAge' in 'field list'
: try catch 안 잡힘.

 

그래서 아래와 같이 두개를 같이 사용하면서 개발합니다.

mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ALL);

/* Throw mysqli_sql_exception for errors instead of warnings */
mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ALL); // 이게 있어야 catch 에 걸림

try {
  $stmt = $conn->prepare("INSERT INTO tb_user (userId, userAge) VALUES (?, ?)");
  $stmt->bind_param("si", $_POST['id'], $_POST['age']);
  $stmt->execute();
  $stmt->close();
} catch (mysqli_sql_exception $e) {
  echo $e->getMessage();
} catch(Exception $e) {
  echo $e->getMessage();
}

위에서 table name 을 없는 table명으로 바꾸고 실행하면 

첫번째 catch 인 mysqli_sql_exception 에 걸립니다.

$e 를 디버그로 찍어보면 아래와 같습니다.

 

728x90
반응형

댓글