프로그래밍/PHP

[CodeIgniter] Message: session_write_close(): Skipping numeric key 0 Error

채윤아빠 2019. 5. 10. 11:31
728x90
반응형



문제점 및 원인분석

다음과 같이 CodeIgniter로 모델에서 받은 데이터를 곧바로 세션에 할당하려는 와중에 위와 같은 오류 메시지를 받았습니다.


if ($this->input->method() === 'post' ) {
    $admin_id = $this->input->post('mem_id');
    $admin_pw = $this->input->post('mem_password');
    $admin = $this->login_model->get_admin($admin_id, $admin_pw);
    if ( isset($admin) && !empty($admin) ) {
        $this->session->set_userdata($admin);

오류 상세 내용은 아래와 같습니다.



아래 참고자료에 따르면 세션의 색인 참조값을 문자열로 준 것이 아니라, 숫자로 주어서 발생한 것이 문제인데, $admin 배열의 의도를 쿼리 결과를 그대로 받은 것이라 "키"->"값" 쌍의 배열로 의도한 것이었습니다.


    public function get_admin($admin_id, $admin_pw) {
        $sql = " 
SELECT
    admin_id, admin_name, admin_level, is_active
FROM ADMINS
WHERE 1 = 1
    AND admin_id = '{$admin_id}'
    AND admin_pw = password('{$admin_pw}')
    AND is_active = 1
;";
        $result = $this->db->query($sql);
        return $result->result_array();
    }

하지만, result_array() 함수의 반환값은 레코드들의 단순 배열이라 세션에 바로 할당할 경우, 첫 번째 키값이 문자열이 아닌 숫자 0이 되어 위 그림과 같은 오류가 발생하였습니다.


해결 방안

다음과 같이 첫 번째 행을 세션에 할당하도록 수정하면 문제가 깔끔하게 해결됩니다.


if ($this->input->method() === 'post' ) {
    $admin_id = $this->input->post('mem_id');
    $admin_pw = $this->input->post('mem_password');
    $admin = $this->login_model->get_admin($admin_id, $admin_pw);
    if ( isset($admin) && !empty($admin) ) {
        $this->session->set_userdata($admin[0]);

달라진 부분은 set_userdata() 호출 시, $admin를 바로 전달하는 것이 아니라, $admin0 과 같이 첫 번째 행을 전달하게 하면, 0이 키로 할당되는 문제가 해결됩니다.


참고자료