[PHP] isset, empty 차이점과 Database 사용시 주의할 점
PHP를 사용하는 많은 프로그래머들이 isset, empty를 이용해서 변수를 체크하고 있을텐데 이 변수들의 미묘한 차이를 모르고 사용하는 경우도 많고 특히 Database와 연결해서 사용할때 왜 자기가 원하는 결과를 도출할수 없는지 힘들어 하는 분들이 있음을 알게 됐다. 나도 나름 다시 생각을 정리할 겸 해서 2개의 함수와 데이터베이스와 연계시 생각해야 할점에 대해서 정리하려고 한다.
간단하게 다음과 같은 코드를 통해 isset과 empty의 차이점을 알아보자.
<?PHP class aaa { public $a; public $b = ""; public $c = 0; public $d = "oragne"; public $e = 123; } $dd = new aaa(); echo "public \$a <BR>--------------<br>"; var_dump($dd->a); echo "<BR>"; echo "isset = "; var_dump(isset($dd->a)); echo "<BR>"; echo "empty = "; var_dump(empty($dd->a)); echo "<BR>"; echo "<BR>"; echo "public \$b = \"\" <BR>--------------<br>"; var_dump($dd->b); echo "<BR>"; echo "isset = "; var_dump(isset($dd->b)); echo "<BR>"; echo "empty = "; var_dump(empty($dd->b)); echo "<BR>"; echo "<BR>"; echo "public \$c = 0 <BR>--------------<br>"; var_dump($dd->c); echo "<BR>"; echo "isset = "; var_dump(isset($dd->c)); echo "<BR>"; echo "empty = "; var_dump(empty($dd->c)); echo "<BR>"; echo "<BR>"; echo "public \$d = \"orange\" <BR>--------------<br>"; var_dump($dd->d); echo "<BR>"; echo "isset = "; var_dump(isset($dd->d)); echo "<BR>"; echo "empty = "; var_dump(empty($dd->d)); echo "<BR>"; echo "<BR>"; echo "public \$e = 123 <BR>--------------<br>"; var_dump($dd->e); echo "<BR>"; echo "isset = "; var_dump(isset($dd->e)); echo "<BR>"; echo "empty = "; var_dump(empty($dd->e)); echo "<BR>"; echo "<BR>";
위와 같은 소스를 사용하면 다음과 같은 결과값을 가지게 된다.
public $a -------------- NULL isset = bool(false) empty = bool(true) public $b = "" -------------- string(0) "" isset = bool(true) empty = bool(true) public $c = 0 -------------- int(0) isset = bool(true) empty = bool(true) public $d = "orange" -------------- string(6) "oragne" isset = bool(true) empty = bool(false) public $e = 123 -------------- int(123) isset = bool(true) empty = bool(false)
눈치가 빠른 분들이 이미 isset과 empty 두 함수의 차이점을 모두 파악하셨으리라 본다. 그래도 아직 눈치채지 못하고 계신분들이 있을수도 있으니 설명은 하도록 하자. isset은 기본적으로 변수에 값이 있느냐를 체크하는 함수로 NULL 과 그외로 분류된다. empty는 변수에 값이 비어있느냐를 체크하는 함수로 NULL, 숫자 0, 빈문자열 “” 과 그외로 분류된다.
empty의 경우 공백문자열(빈문자열)이 있거나 0이 있으면 NULL 일때와 마찬가지로 값이 비어있는 것으로 해석한다. NULL이라는 것은 값이 없음을 의미하는 것이고 그 값은 0도 포함되지 않는것을 말하는데 empty는 함수는 null = 0 = “” 3가지가 다 같은 리턴값 true를 반환한다.
따라서 일반적으로 변수에 값이 있는지를 체크할때는 isset을 사용하는 것이 일반적이며 NULL과 NULL이 아닌 값으로 분명하게 나눠 체크할수 있게 된다.
정작 문제는 Database와 함께 사용할때 나타난다. Database에서는 보통 기본값을 Not Null로 주기 때문에 공백문자열(빈문자열)을 받아오거나 기본값 0으로 설정된 값을 받아오는 경우가 허다하다. 프로그래밍을 할때 값이 들어가지 않은 필드에 대해 프로그래머는 값이 없다는 생각을하여 isset으로 체크하게 되면 문제가 생긴다. isset은 명백하게 NULL만을 true로 리턴하기 때문이다.
마찬가지로 쉬운 예제를 통해 위의 이야기를 확인하는 것이 가장 좋은 이해법이라고 생각한다.
<?PHP // Database open $db = new PDO(PDO_DSN, DB_USER, DB_PASS); $sql = "SELECT * FROM table_name WHERE id = 1"; $stmt = db->prepare($sql); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row); ?> 실행화면 ------- array(9) { ["id"]=> string(1) "1" ["todo"]=> string(59) "프로그램 개발 완료" ["tdate"]=> string(10) "2019-12-31" ["mem_id"]=> string(1) "1" ["person"]=> string(9) "아칼" ["duty"]=> string(0) "" ["complete"]=> string(1) "0" ["startdate"]=> string(10) "2019-02-12" ["enddate"]=> NULL }
var_dump로 출력된 $row 값들을 자세히 살펴보면 쉽게 이해가 될것이다. 일단 주의해야할 점은 변수형이 모조리 String 타입으로 불려온다는 점이다. 또한 계속 말한바와 같이 $row[‘duty’] 같은 경우는 빈문자열로 isset은 값이 있다고 체크하여 true를 반환할 것이다. 따라서 이런 상황에 알맞게 변수를 체크해줄수 있어야 하겠다.
이렇게 설명했는데도 이해가 안된다 하시면 저도 할말은 없;;;;;습니다…
isset과 empty는 조건체크에 많이 사용하게 되는 함수라 명확히 알고 있는게 좋으며, DB와 연결시에 주의해야할 부분까지 숙지하고 있다면 실제 프로그래밍에서 발생할수 있는 오류를 막는데 큰 도움이 될것입니다.
오타가있네요
isset은 명백하게 NULL만을 true로 리턴하기 때문이다.
-> isset은 명백하게 NULL만을 false로 리턴하기 때문이다.
좋은글 잘보고갑니다.