php8 에서 에러발생시 or die() 로 가지 않고 http 500 에러로 종료됩니다.
본문
항상 도움은 주지도 못하면서 질문만 해서 죄송하네요.
카페24 호스팅을 새로 신청했습니다.
전에 카페24의 php 버전 7.3.1 에서는 문제가 없었던 코드가 이번 8.2.7 에서 이상하게 작동합니다.
특히 mysqli_ 함수를 사용할 때인데, 예를들어...
$conn = mysqli_connect(HOST, USER, PW, DB) or die("에러발생: ".mysqli_error($conn));
위 코드에서 정상적으로 접속되면 문제없는데 접속이 실패하면..
에러발생: Fatal error : ......
이런식으로 종료되어야 하는데 die()는 무시되고 그 전에 mysqli_connect(...) 단계에서 스크립트가 끝나면서 HTTP 500 에러가 발생합니다.
mysqli_connect 뿐만 아니라 mysqli_query 역시 마찬가지 입니다.
구글에서 검색해 보니 스크립트 맨앞에...
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ERROR | E_PARSE);
ini_set("display_errors",1);
위 내용을 넣으니 에러가 출력되기는 하는데..질문의 요점은..
여기서도 역시 die() 까지 가지는 않고 mysqli_connect() 단계에서 sql 에러만 출력하고 끝납니다.
어떻게 해야 or die("에러발생: ".mysqli_error($conn)); 까지 가서 "에러발생: Fatal error....." 이렇게 나오게 할 수 없나요?
그렇지 않으면 기존 소스를 수정해야 할 부분이 너무 많아서...ㅠ
참고로 똑같은 소스인데 php 7.3.1 카페24 호스팅에서는 문제 없습니다.
소스는 다음과 같습니다.
<?php
$host = "localhost";
$user = "xxx"; // 에러 나오게 일부러 아이디,비번,db 틀리게 함
$pw = "yyy";
$db = "zzz";
$conn = mysqli_connect($host, $user, $pw, $db) or die("에러발생: ".mysqli_error($conn));
?>
답변 6
수정해봤습니다.
$conn = null;
try {
$conn = new mysqli($host, $user, $pw, $db);
$conn->set_charset("utf8");
} catch (Exception $e) {
error_log($e->getMessage());
}
if ($conn && $conn->connect_errno) {
error_log("Error connect to DB: " . $conn->connect_error);
}
if ($conn) {
// 어쩌구 저쩌구
} else {
// 저쩌구 어쩌구
}
저는 디버그 편하게 하기위해 try~catch를 선호하는지라.
try~catch 말고는 원본 소스에서 약간만 수정해보면 좋을거 같습니다.
mysqli_report(MYSQLI_REPORT_OFF);
$conn = @mysqli_connect(HOST, USER, PW, DB);
if (!$conn) {
$error_message = "오류: " . mysqli_connect_error();
} else {
// 어쩌구 저쩌구
}
$host에 localhost말고 127.0.0.1 한번 넣어보세요
에러 내용이 뭔가요?
try {
$conn = new mysqli($host, $user, $pw, $db);
$conn->set_charset("utf8");
} catch (Exception $e) {
error_log($e->getMessage());
exit('Error connecting to DB');
}
try catch로 하실 거면 그대로 하시면 되고 기존처럼 하실 거면 아래처럼 하면 됩니다.
mysqli_report(MYSQLI_REPORT_OFF);
$conn = mysqli_connect(HOST, USER, PW, DB) or die("에러발생: ".mysqli_connect_error());
첫 번째 링크 Note 부분 보시면 나오는데 쿼리나 연결에서 오류가 있을 경우 예전에는 객체를 반환했는데 예외 모드가 활성화되어 있지 않을 경우(php 8.1부터)는 false만 리턴하고 죽어 버린다고 합니다.
php 8.1부터 그렇다고 합니다.
자세한 내용은 아래 링크 참고해 보세요.
https://www.php.net/manual/en/function.mysqli-connect.php
!-->