php
  • codeigniter
  • session
  • 2010-07-14 6 views 1 likes 
    1

    CodeIgniter를 기반으로하는 웹 사이트의 범용 헤더를 만들려고하는데 '로그인'링크를 전환 할 코드를 찾는 데 문제가 있습니다. .CodeIgniter에서 "Login"버튼을 사용자 이름으로 바꾸는 방법

    if(!$this->session->userdata($userSessionVar)) 
        { 
         $data['header_output'] = "<li><a href='" . base_url() . "index.php/main/login'>Login</a></li>"; 
        } else 
        { 
         $data['header_output'] = $this->session->data('userFirstName'); 
        } 
    

    가 (난이 불완전 실현 기반 : 사용자가 로그인 한 후 (프로필 페이지에 대한 링크) 사용자 이름 컨트롤러 기능에서

    , 나는 다음과 같은 코드를 시도했습니다 내 디자인에서는 테스트하는 것만으로 충분합니다.) $ userSessionVar는 로그인 한 후 "로그인"한 값을 보유하고 있습니다. 아마도 가장 좋은 방법은 아닙니다. 그리고 그것은 작동하지 않는 것 같습니다 (그리고 $ 데이터를보기로 전달합니다).

    function check_login() 
    { 
    $CI =& get_instance(); 
    
    $userSessionVar = 'logged_in'; 
    
    if(! $CI->session->userdata($userSessionVar)) 
    { 
        return false; 
    } return true; 
    } 
    

    을 그리고는 $ header_output 변수를 구성하기 위해 참/거짓 반환을 사용 : 나는 또한 사용자 지정 기능을 시도했습니다. 이들 중 어느 것도 작동하지 않는 것 같습니다. CodeIgniter를 처음 접했고 PHP/HTML/CSS 등의 중간 수준을 가지고 있습니다. 코드를 포함하지 않도록하는 방법에 대해 명확한 내용이 빠졌고 어떤 도움도 주시면 감사하겠습니다. 모든 컨트롤러 기능에서.

    답변

    1

    변수 $userSessionVar은 함수 check_login()에서만 사용할 수 있으므로 함수 외부에서 사용하려고하면 빈 상태 (따라서 쓸모가 없습니다)가됩니다.

    변수 $userSessionVar을 사용하여 상수 값을 저장하는 대신 $this->session->userdata('logged_in')$CI->session->userdata('logged_in')을 사용하는 것이 좋습니다.

    또한 코드에 오류가 있습니다. $this->session->data('userFirstName')$this->session->userdata('userFirstName')으로 대체해야합니다.

    다음은 사용자 데이터를 처리하는 일반적인 방법입니다. 먼저 auth.php를 models 폴더에 추가하십시오.

    <?php 
    
    class Auth extends Model { 
        private $user_data = false; 
        function Auth() { 
         parent::Model(); 
    
         if ($this->input->post('action') == 'login') $this->login(); 
         else if ($auth_id = $this->session->userdata('auth_id')) { 
          $user = // load user data from the database into the variable $user 
          if ($user) { 
           $this->user_data = $user; 
          } else $this->session->unset_userdata('auth_id'); 
         } 
        } 
        function login() { 
         // process POST, check with database, and then store user_id using 
         // $this->session->set_userdata('auth_id', $user_id_here) 
        } 
        function me() { 
         return $this->user_data? (object)$this->user_data : false; 
        } 
    } 
    
    ?> 
    

    그런 다음 모델을 자동로드하십시오. 과 같이이 편집 설정/autoload.php하려면 :

    $autoload['model'] = array('auth'); 
    

    을 이제 IF 문은 다음과 같을 수 있습니다 :

    if ($me = $this->me()) $data['header_output'] = $me->userFirstName; 
    else $data['header_output'] = '<li><a href="'.base_url().'index.php/main/login">Login</a></li>'; 
    
    +0

    빠른 응답을 보내 주셔서 감사합니다. 난 주위에 내 머리를 잡으려고 - 사용자가 새 페이지를 방문 할 때마다 $ 사용자가 재설정됩니다, 또는 한 번만 그것은 사용자의 세션을 통해 지속됩니까? 그리고 모든 사용자 데이터를 세션에로드하는 것과 반대로이 기능의 장점은 무엇입니까? – tchaymore

    +0

    @ tchaymore : 예, 모든 페이지로드시 데이터베이스에서 사용자 데이터를 다시로드합니다. 이것은 실행중인 다른 모든 데이터베이스 쿼리와 비교할 때 대개 사소한 것입니다. 가장 큰 장점은 다른 사용자가 설정 한 사용자 정보/권한이 요청간에 변경되는 경우 $ this-> auth-> me()가 항상 새로운 데이터를 반환한다는 것입니다. 세션에 저장하는 모든 데이터가 오래 될 수 있습니다. 또한 특히 데이터가 쿠키에 저장되는 경우 세션 데이터를 작게 유지하는 것이 좋습니다. 소규모 사이트에서이 인수는 설득력이 없을 수도 있지만, 어쨌든 코드가 더 단순 해집니다. –

    +0

    설명해 주셔서 감사합니다.그러나이 코드는 "private $ user_data = false;"에 대해 "구문 분석 오류 : 구문 오류, 예기치 않은 T_PRIVATE"를 표시합니다. 선. – tchaymore

    0

    을 모델에 당신이 문

    있어 auth.php

    클래스 정식 모델 및 parent :: Model();

    CodeIgniter에서는 "CI_Model"이 아니어야합니까?

    관련 문제