질문 Q #9837
Call to a member function select() on a non-object
코드원 2012-04-24 11:58:19

 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라고 나오는데... 이게 무슨 말인지요?

초보입니다.

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

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

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

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

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

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

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

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

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


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

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

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

그럼 $CI 수정을 안해도 될거 같은데요?
#9 코드원 2012-04-24 13:03:41
 혹시 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;
 }


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

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

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

아마도 컨트롤러에서 직접 사용하셔서 그럴 수도 있습니다. 
#11 코드원 2012-04-24 15:50:38
 //웅파님. 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 컨트롤러


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

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

만약 아래와 같이 사용중 이시라면 지금 나오는 에러들은 이해가 안되는데요.. ^^;;
class Summary extends CI_Controller {
....
}



#17 코드원 2012-04-24 23:39:27
 //불의 회상님, CI_Controller에서 상속받아진거 맞는거 같은데요.

class Auth extends CI_Controller{
Auth 컨트롤러 그대로 사용하고 있으니깐요.
#18 한대승(불의회상) 2012-04-25 10:43:32
코드윈// 그렇군요..

is_username_available()가  Auth의 멤버 함수 라면
$this->load->database()를 이용하여 DB를 로드 한 후
$this->db->select()  와 같이 사용되는 함수들은 당연히 동작 하는게 정상일텐데요. 

에러 코드들을 보면 $this  에 로드된 DB라이브러리 들이 정상적으로 동작하지 않는것으로 보입니다.

$CI =& get_instance();를 사용한다는 것 자체가 이상하다라는 생각이 들어서 물어본겁니다.
#19 코드원 2012-04-25 12:01:57
//불의 회상 저도 이해가 안되요. 함수내에 일일 인스턴스와 db 로드를 할수 없는 노릇이고 참 답답하네요 Ci다시 설치해서 해봐야 할것 같아요
#20 milosz 2012-04-26 11:10:59
tank_auth 라이브러리를 로드한 후에 is_username_available 를 어디서 어떻게 사용하신건지 소스 올려주실 수 있나요? 컨트롤러에서 $this->tank_auth->is_username_available(); 식으로 라이브러리를 통해 호출해서 사용한 것이 아니라면 위와 같은 에러가 날 것 같은데요.
#21 코드원 2012-04-26 17:01:42
 //milosz님 답변 감사합니다. tank_auth를 제가 수정해서 사용하는것이 아닌. 있는 그대로 다운 받아서 사용하고 있어요. 다른 곳 전혀 수정한 것 없구요. 소스를 보니 

$this->tank_auth->is_username_available();
이 부분이 아래처럼 되어 있더군요.
function is_username_available($username)
 {
  return ((strlen($username) > 0) AND $this->ci->users->is_username_available($username));
 }

function create_user($username, $email, $password, $email_activation)
 {
  if ((strlen($username) > 0) AND !$this->ci->users->is_username_available($username)) {
   $this->error = array('username' => 'auth_username_in_use');

  } elseif (!$this->ci->users->is_email_available($email)) {
   $this->error = array('email' => 'auth_email_in_use');

  } else {
   // Hash password using phpass
   $hasher = new PasswordHash(
     $this->ci->config->item('phpass_hash_strength', 'tank_auth'),
     $this->ci->config->item('phpass_hash_portable', 'tank_auth'));
   $hashed_password = $hasher->HashPassword($password);

   $data = array(
    'username' => $username,
    'password' => $hashed_password,
    'email'  => $email,
    'last_ip' => $this->ci->input->ip_address(),
   );

   if ($email_activation) {
    $data['new_email_key'] = md5(rand().microtime());
   }
   if (!is_null($res = $this->ci->users->create_user($data, !$email_activation))) {
    $data['user_id'] = $res['user_id'];
    $data['password'] = $password;
    unset($data['last_ip']);
    return $data;
   }
  }
  return NULL;
 }
보니깐 위에 처럼 되어 있네요.
#22 milosz 2012-04-27 13:28:06
음... tank_auth를 받아서 codeigniter에 설치하고나서 아이디를 생성하면 해당 에러가 나타나나요? 말씀하신 인증 페이지가 기존에 있는 auth 컨트롤러 외에 별도의 컨트롤러에서 만드셨나요? 뭔가 설치가 잘못된 것인지.. 흠;
#23 코드원 2012-04-27 14:50:07
 // milosz 별도로 컨트롤러를 생성해서 한건 없구요. 설치가 잘 못 건지도 모르지요. 근데..아직 왜 그런지 모르겠어요.
#24 milosz 2012-04-27 15:28:12
일단 작업하시던거 백업하시고 CI와 tank_auth를 다시 올리셔서 해당 부분이 정상 동작 하는지 확인해보셔야 할 것 같아요. ㅜㅜ
#25 킹태우님 2019-07-01 15:54:23

application/config/autoload.php 에서 아래 설정 추가하면 해결됩니다.

$autoload['libraries'] = array("database");