새소식

Welcome to the tech blog of Junior Backend Developer Myoungji Kim!

Development/PHP

PHP 8.1: MYSQLI_REPORT 기본 오류 모드 변경

  • -

📌 이슈

현재 회사에서 php 7.0와 8.2, 2개 버전의 서비스를 관리하고 있다.
8.2로 버전업하면서 7.0에서 숨어있던 여러 레거시로 인한 에러들이 나타나기 시작했다.

UPDATE {table}
SET {column}={value}
WHERE {column} IN ();

최근에는 syntax 에러를 유발하는 동일한 쿼리임에도 버전별로 결과가 7.0에서는 에러가 무시되고 있던 것을 발견했다.

📝 분석

https://www.php.net/manual/en/mysqli-stmt.execute.php
7.0에서는 이슈 쿼리를 execute()할 경우, UPDATE 처리할 대상이 없기에 아무런 동작도 발생하지 않고 함수가 종료되는 것을 확인했다.

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

이와 달리, 8.2에서는 syntax 에러로 exception이 발생했고 throw 됨에 따라 프로세스가 종료되었다.

🔍 원인

MySqli 기본 오류 모두 변경

- MYSQLI_REPORT_OFF
+ MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT

PHP 8.1에서는 MySQLi 확장 프로그램의 기본 오류 처리 동작이 오류를 숨기는 것에서 오류 발생 시 예외를 발생시키는 것으로 변경

⚒️ 결론

PHP 7.0 버전의 서비스에서는 기본값이 MYSQLI_REPORT_OFF였기에,
로직 상으로는 dev stage일 경우에만 MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT를 세팅해주는 로직이 있었다.

PHP 8.2 버전의 서비스에서는 해당 분기처리가 삭제되어도 무방해졌다! 👏
더불어 버전업하면서 숨어있던 레거시 에러들이 곧 더 튀어나올 수 있겠다는 생각이 들었다.

이번에 알게 된 사례를 토대로 빠르게 대응할 수 있도록 해야겠다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.