반응형
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
반응형
'php' 카테고리의 다른 글
[PHP] log4php 사용하기 (0) | 2022.04.28 |
---|---|
[Visual Studio Code] PHP Class 변수 Getter, Setter 자동생성 (0) | 2022.04.09 |
[PHP] MySQL How To Prevent SQL Injection #SQL 공격 방지 (0) | 2021.01.09 |
[PHP] mysqli injection #SQL 공격 (0) | 2021.01.09 |
[PHP] 비밀번호 처리. password_hash, password_verify (0) | 2021.01.09 |
댓글