CI 묻고 답하기

제목 Call to a member function select() on a non-object
글쓴이 코드원 작성시각 2012/04/24 11:58:19
댓글 : 25 추천 : 0 스크랩 : 0 조회수 : 23454   RSS

 Call to a member function select() on a non-object 

function is_username_available($username)
 {
  $this->db->select('1', FALSE);
  $this->db->where('LOWER(username)=', strtolower($username));

  $query = $this->db->get($this->table_name);
  return $query->num_rows() == 0;
 }
(위에 select('1', FALSE) 부분에서 에러가 나는거 같아요)

 tank_auth 로 인증페이지를 만드는 중에 위와 같은 에러 메시지가 나왔습니다.

 DB 연결 설정은 제대로 되어있구요.

select()함수 멤버를 콜하는데 non-object라고 나오는데... 이게 무슨 말인지요?

초보입니다.

도움 부탁드리겠습니다.
 다음글 restful 질문드립니다.. (2)
 이전글 mysql의 password() 어떻게 사용하면 되나요... (4)

댓글

변종원(웅파) / 2012/04/24 12:18:11 / 추천 0
  $this->db->select('1', FALSE); <- 이 부분은 필드나 테이블명을 백틱(`)으로 감싸지 말라는 것인데 1만 준다면 필요가 없을 것 같습니다.

$this->db->select('1'); 로 해보세요
코드원 / 2012/04/24 12:23:21 / 추천 0
 //웅파님 늘 도움 감사드립니다. 웅파님께서 알려주신대로 해보니깐..여전히 똑같은 메시지입니다.ㅡ,ㅡ
코드원 / 2012/04/24 12:28:10 / 추천 0
 더욱 웃긴건 그 해당라인을 주석으로 처리하고 where 부분만 해서 하면 where라인이 위와 같은 에러메시지가 나온다는거에요. username 은 잘 넘어오구요.
변종원(웅파) / 2012/04/24 12:46:36 / 추천 0
그럼  $this->table_name 이 값이 제대로 나오는지 찍어보시고

3, 4번 라인 주석처리하고 해보시면 답이 나올거 같네요.

혹시 모르니까 4번 라인에 세번째 파라미터 FALSE도 넣어서 해보시구요
한대승(불의회상) / 2012/04/24 12:49:56 / 추천 0
DB설정에 문제가 없다면...

$this->load->database();
로 DB가 정상적으로 로딩 되어 있는지 확인해 보세요.

코드원 / 2012/04/24 12:53:42 / 추천 0
//웅파님 일단 3,4라인 주석으로 처리하고 $this->table_name  로 찍어보니까 users라고 찍혀요.
//불의 회상님 답변 감사합니다.   $this->load->database();  넣어서 해봐니
Call to a member function database() on a non-object

똑같은 에러 메시지가 나옵니다.

변종원(웅파) / 2012/04/24 12:58:32 / 추천 0
지금 tank_auth의 모델인 users 에서 작업하시는거죠?

database() 조차 못 찾는 것을 보면 $this 객체가 선언이 안된것 같네요.


$CI =& get_instance();
$CI->load->database();

위 두 줄을 3번 라인전에 넣고 해보세요.

$this 라고 되어 있는 부분도 전부 $CI로 바꾸시구요.
코드원 / 2012/04/24 13:01:39 / 추천 0
 // 웅파님 말씀대로 해보니깐.. 넘어가네요. $this 선언을 어디서 해야하나요?

그럼 $CI 수정을 안해도 될거 같은데요?
코드원 / 2012/04/24 13:03:41 / 추천 0
 혹시 tank_auth users.php에서 아래와 같이 되어 있어서 그런건가요?
function __construct()
 {
  parent::__construct();

  $ci =& get_instance();
  $this->table_name   = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name;
  $this->profile_table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->profile_table_name;
 }


변종원(웅파) / 2012/04/24 13:36:14 / 추천 0
tank_auth users 모델을 사용하시기 위해서는 컨트롤러에서 tank_auth 라이브러리가 로딩되어 있어야 할 겁니다. 

tank_auth의 구조가 라이브러리를 로딩하고 그 라이브러리에서 모델을 로딩하는 구조인데 
그렇게 안되어 있으면 에러가 날겁니다.

auth 컨트롤러 보시면 tank_auth 라이브러리의 함수들을 사용하지 users 모델을 직접 사용하지는 않습니다.

아마도 컨트롤러에서 직접 사용하셔서 그럴 수도 있습니다. 
코드원 / 2012/04/24 15:50:38 / 추천 0
 //웅파님. auth컨트롤러에서 이미 tank_auth 라이브러리를 이미 로딩을 했어요.

function __construct()
    {
        parent::__construct();

        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');
        $this->load->library('security');
        $this->load->library('tank_auth');        
        $this->lang->load('tank_auth');
    }
auth 컨트롤러


 이미 로딩이 되어 있음에도 에러가 나요.

milosz / 2012/04/24 16:04:36 / 추천 0
컨트롤러에서 $this->tank_auth->is_username_available() 식으로 사용하신거죠?
코드원 / 2012/04/24 16:16:45 / 추천 0
 //milosz님, 아니요. tank_auth 있는 그대로 사용중이에요. 그리고 컨트롤러에서 tank_auth라이브러리를 로딩해줬음에도 저런 애러가 나네요.
한대승(불의회상) / 2012/04/24 17:12:25 / 추천 0
class 상속은 어떻게 받으 셨나요?
코드원 / 2012/04/24 17:26:12 / 추천 0
 // 클래스 상속이랄것도 없어요. 그냥 tank_auth 압축파일 그대로 받아서 사용중이에요. 변경하거나 그런거 없어요.