프로그래밍/PHP

CodeIgniter에서 쿼리 결과에 처리 주의할 점 ; COUNT () 등 함수 사용 등

채윤아빠 2018. 10. 31. 17:55
728x90
반응형



CodeIgniter에서 DB의 쿼리 결과를 받아서 처리하는데, unbuffered_row() 또는 row() 함수를 이용하게 되는데, 주의할 점은 기본적으로 레코드가 stdClass Object로 변환되어 받게 된다는 점이다.
문제는 다음과 같이 쿼리를 작성하였을 경우, "COUNT" 에 대한 변수명을 처리하기가 애매해 진다.

    $sql = "SELECT COUNT(1) FROM member WHERE user_name LIKE '%{$name}%';";


foreach()를 통하여 반환된 레코드 클래스에 접근한다면 문제가 발생하지 않지만, key <> value 쌍으로 반환되기 때문에 해당 key를 찾아서 작업을 별도로 해줘야 하기 때문에 번거로운 작업이 필요하게 된다.

다음은 Pagination을 위하여 전체 사용자수를 얻는 함수의 예이다.

    function getMembersCount($name)
    {
        if (isset($name) && (trim($name) != ""))
            $sql = "SELECT COUNT(1) FROM member WHERE user_name LIKE '%{$name}%';";
        else
            $sql = "SELECT COUNT(1) FROM member;";
        $result = $this->db->query($sql);
        $row = $result->unbuffered_row();
        if (isset($row))
        {
            foreach($row as $key => $value)
            {
                return $value;
            }
        }
        else
            return 0;
    }

가장 좋은 방법은 개발자가 쿼리를 작성할 때 다음과 같이 출력 결과에 대한 필드 별칭을 모두 붙여주는 방법이다.

    $sql = "SELECT COUNT(1) AS member_count FROM member WHERE user_name LIKE '%{$name}%';";

다음은 Pagination을 위하여 전체 사용자수를 얻는 함수의 예에 필드 별칭을 설정한 예이다.

    function getMembersCount($name)
    {
        if (isset($name) && (trim($name) != ""))
            $sql = "SELECT COUNT(1) AS member_count FROM member WHERE user_name LIKE '%{$name}%';";
        else
            $sql = "SELECT COUNT(1) AS member_count FROM member;";
        $result = $this->db->query($sql);
        $row = $result->unbuffered_row();
        if (isset($row))
        {
            return $row->member_count;
        }
        else
            return 0;
    }