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)를 반환하도록 변경되었습니다.
- PHP 5.3:
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로 변경되었습니다. 따라서 버전 업그레이드 시 오프셋 인자의 타입을 명확히 확인해야 합니다.
참고자료
기타 참고자료
- 이전글그누보드4 사이드뷰 미사용 시 회원 아이콘 목록 출력 및 레이어 팝업 설정 방법 26.09.27
- 다음글그누보드 게시판 글쓰기 필수 입력 항목(제목·내용) 우회 및 강제 값 설정 방법 26.09.27
댓글목록
등록된 댓글이 없습니다.