BOARD

문제 해결

PHP DB 쿼리 결과 확인 및 isset 동작 차이

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 8회 작성일 26-09-27 16:15

본문

PHP DB 쿼리 결과 확인 및 isset 동작 차이

그누보드 기능을 적용하거나 문제를 해결하려는 운영자·개발자가 쿼리 결과 유무를 올바르게 판단하고 PHP 버전별 isset 동작 차이를 이해할 수 있도록 돕습니다.

mysql_query 결과와 if(!$result) 문법의 동작 원리

mysql_query() 함수는 쿼리 실행 결과가 비어 있거나 매치되는 데이터가 전혀 없는 경우에도 false를 반환하지 않고, 내부적으로 리소스 객체(Resource id, 예: Resource id #2)를 반환합니다.

따라서 데이터가 존재하지 않을 때 if(!$result) 구문은 리소스 객체의 존재를 참(true)으로 인식하여 올바르게 기능을 수행하지 못하며, 의도한 "등록된 내용이 없습니다"라는 메시지 대신 예외나 오동작을 일으키게 됩니다.

올바른 데이터 유무 확인 방법

데이터베이스 쿼리 결과의 유무를 정확하게 확인하려면 mysql_query() 결과값 자체를 조건문(!$result)에 넣는 대신, mysql_fetch_array() 등의 함수를 사용해 실제 데이터 행을 가져온 뒤 그 안의 필드 값이나 변수의 존재 여부를 확인해야 합니다.

<?php
$query = "select * from 테이블이름 order by 조건절 desc";
$result = mysql_query($query);
$data = mysql_fetch_array($result);
$isset_check = $data["mb_id"]; // 필드 데이터 하나를 호출합니다.

if(isset($isset_check)) {
 // 자료가 있을 때
 while($row = mysql_fetch_array($result)) {
 echo $row[name];
 }
} else {
 // 자료가 없을 때
 echo "등록된 내용이 없습니다!\n";
}
?>

PHP 버전별 isset() 함수 동작과 주의사항

PHP 버전이 올라가면서 isset() 함수를 사용하여 필드 값이나 변수의 존재 여부를 확인할 때 특히 문자열 오프셋 처리 방식의 변화에 주의해야 합니다.

PHP 버전별 문자열 오프셋 처리 차이

PHP 5.4.0 이후 버전부터는 isset()에 전달되는 문자열 오프셋 처리 방식이 변경되었습니다. PHP 5.3 버전과 PHP 5.4 버전에서의 주요 차이는 다음과 같습니다.

  • 숫자 형태의 오프셋: 'somestring'[0]이나 'somestring'['0']과 같이 숫자 형태의 오프셋을 전달하는 경우 PHP 5.3과 PHP 5.4 모두 bool(true)를 반환합니다.
  • 문자열 형태의 오프셋: 'somestring'['some_key']나 'somestring'['0.5'], 'somestring'['0 Mostel']과 같이 숫자가 아닌 문자열 오프셋을 전달하는 경우 처리 결과가 달라집니다.
    • PHP 5.3: bool(true)를 반환합니다.
    • PHP 5.4 이후: bool(false)를 반환하도록 변경되었습니다.

DB 쿼리 결과 확인 시 isset() 활용 조건

mysql_query()와 같은 레거시 함수는 쿼리 결과가 없어도 리소스 ID를 반환하므로 단순한 if(!$result) 조건문으로는 데이터 유무를 정확히 판단할 수 없습니다. 따라서 mysql_fetch_array() 등을 통해 실제 데이터 행을 가져온 뒤 특정 필드 값을 변수에 담고 isset() 함수로 존재 여부를 확인해야 합니다.

<?php
$query = "select * from 테이블이름 order by 조건절 desc";
$result = mysql_query($query);
$data = mysql_fetch_array($result);
$isset_check = $data["mb_id"]; // 필드 데이터 호출

if(isset($isset_check)) { 
 // 자료가 있을 때
 while($row = mysql_fetch_array($result)) {
 echo $row[name];
 }
} else { 
 // 자료가 없을 때
 echo "등록된 내용이 없습니다!\n";
}
?>

상황별 판단 및 행동 가이드

내 상황우선할 판단다음 행동
if(!$result) 문법으로 쿼리 결과를 확인했으나 데이터가 없어도 항상 참으로 판별되는 경우mysql_query는 결과가 없을 때도 리소스 ID를 반환하므로 불리언 값으로 직접 검사할 수 없음을 인지mysql_fetch_array 등으로 실제 데이터 행을 먼저 호출한 뒤 필드 값의 존재 여부 확인
PHP 5.4 이상 환경에서 배열이 아닌 문자열 오프셋이나 키를 isset()에 전달하여 예기치 않은 결과가 발생하는 경우PHP 5.4부터 비숫자 형태의 문자열 오프셋에 대한 isset() 반환값이 false로 변경된 사양 확인코드 내 변수 타입과 isset() 검증 로직이 대상 환경 버전에 맞게 작성되었는지 수정 및 점검

실전 FAQ

Q. mysql_query 결과가 비어있는지 확인할 때 if(!$result) 대신 어떤 함수를 조합해야 하나요?

  • 대안: mysql_query() 직후에 if(!$result)를 쓰면 리소스 ID가 반환되어 참이 되므로, mysql_fetch_array($result)를 이용해 실제 데이터를 변수에 담고 해당 필드값(예: $data['mb_id'])에 isset()을 적용해야 합니다.

Q. PHP 5.3에서 정상 동작하던 문자열 오프셋 isset 코드가 PHP 5.4 이상에서 오류를 내거나 다르게 동작하는 이유는 무엇인가요?

  • 예외/막히는 지점: PHP 5.4.0 이후부터는 isset() 함수에 숫자가 아닌 문자열 오프셋(예: 'somestring'['some_key'])을 전달할 때의 반환값이 기존 true에서 false로 변경되었습니다. 따라서 버전 업그레이드 시 오프셋 인자의 타입을 명확히 확인해야 합니다.

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.