CI 묻고 답하기

제목 Call to a member function select() on a non-object
글쓴이 코드원 작성시각 2012/04/24 11:58:19
댓글 : 25 추천 : 0 스크랩 : 0 조회수 : 22327   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 18:00:08 / 추천 0

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



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

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

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

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

$CI =& get_instance();를 사용한다는 것 자체가 이상하다라는 생각이 들어서 물어본겁니다.
코드원 / 2012/04/25 12:01:57 / 추천 0
//불의 회상 저도 이해가 안되요. 함수내에 일일 인스턴스와 db 로드를 할수 없는 노릇이고 참 답답하네요 Ci다시 설치해서 해봐야 할것 같아요
milosz / 2012/04/26 11:10:59 / 추천 0
tank_auth 라이브러리를 로드한 후에 is_username_available 를 어디서 어떻게 사용하신건지 소스 올려주실 수 있나요? 컨트롤러에서 $this->tank_auth->is_username_available(); 식으로 라이브러리를 통해 호출해서 사용한 것이 아니라면 위와 같은 에러가 날 것 같은데요.
코드원 / 2012/04/26 17:01:42 / 추천 0
 //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;
 }
보니깐 위에 처럼 되어 있네요.
milosz / 2012/04/27 13:28:06 / 추천 0
음... tank_auth를 받아서 codeigniter에 설치하고나서 아이디를 생성하면 해당 에러가 나타나나요? 말씀하신 인증 페이지가 기존에 있는 auth 컨트롤러 외에 별도의 컨트롤러에서 만드셨나요? 뭔가 설치가 잘못된 것인지.. 흠;
코드원 / 2012/04/27 14:50:07 / 추천 0
 // milosz 별도로 컨트롤러를 생성해서 한건 없구요. 설치가 잘 못 건지도 모르지요. 근데..아직 왜 그런지 모르겠어요.
milosz / 2012/04/27 15:28:12 / 추천 0
일단 작업하시던거 백업하시고 CI와 tank_auth를 다시 올리셔서 해당 부분이 정상 동작 하는지 확인해보셔야 할 것 같아요. ㅜㅜ
킹태우님 / 2019/07/01 15:54:23 / 추천 0

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

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