| 제목 | 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라고 나오는데... 이게 무슨 말인지요? 초보입니다. 도움 부탁드리겠습니다. |
|||
| 다음글 | restful 질문드립니다.. (2) | ||
| 이전글 | mysql의 password() 어떻게 사용하면 되나요... (4) | ||
|
한대승(불의회상)
/
2012/04/24 18:00:08 /
추천
0
|
|
코드원
/
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"); |
|
tuyitu719
/
2026/03/14 11:03:31 /
추천
0
즉, 지금 상황은 DB 설정값을 적어둔 것과 별개로, 실제 Database 클래스가 로드되지 않았을 가능성이 가장 큽니다. CodeIgniter는 데이터베이스를 자동 연결(autoload)하거나, 코드에서 직접 그래서 보통은 모델 생성자에서 아래처럼 처리합니다. 컨트롤러/확장 클래스에서 생성자를 직접 만들었다면 class Users extends CI_Model {
function __construct() { parent::__construct(); $this->load->database(); } 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) 부분이 문제라기보다는
그 앞의 $this->db 가 객체가 아니라서 생기는 에러입니다. 즉, DB 설정은 되어 있어도 실제로 database 라이브러리가 로드되지 않은 상태일 가능성이 큽니다. 보통은 모델 생성자에 parent::__construct(); $this->load->database(); 를 넣거나, autoload.php 에서 database 를 자동로드하면 해결됩니다. 만약 생성자를 직접 만드셨는데 parent::__construct()를 안 쓰셨다면 그것 때문에 CI 자원이 정상 초기화되지 않았을 수도 있습니다. 그리고 이 코드가 모델이 아니라 라이브러리 안에 있다면 $this->db 가 아니라 get_instance()로 접근해야 합니다. |
만약 아래와 같이 사용중 이시라면 지금 나오는 에러들은 이해가 안되는데요.. ^^;;
class Summary extends CI_Controller { .... }