2013-02-27 3 views
1

나는이 문제가 있거나 어떻게 작동하는지 개념을 알지 못하고 기억 기능을 가진 로그인을 만들었습니다. 사용자가 확인하면 쿠키에 저장하므로 웹 페이지를 다시 입력하면 주 페이지로 직접 액세스 할 수 있으며 다시 로그인 할 수는 없습니다 .. 문제는 사용자가 정상적으로 로그인 할 때 세션 정보를 저장하면, 그러나 사용자가 rembmber의 쿠키를 갖고 사이트에 로그인하지 않고 직접 입력하면 어떻게됩니까? 나는 그 세션 정보를 잃는다. 내가해야 할 일은 무엇인가?세션 및 쿠키 작업

나는 당신이 코멘트를 이해하지 못해 내가 더 잘 설명해 주었으면 좋겠다.

+0

사용자가 들어 왔는지 확인하고 누락 된 세션 데이터를 복원해야합니다. –

+0

왜 세션을 사용합니까? ** COOKIE **와 사용자의 테이블 만 데이터베이스에서 사용할 수 있습니다. -'setcookie ("username", "blanked", time() - 3600 * 25, '/'); N 시간 후에 쿠키를 해제 할 수 있습니다. –

답변

0

세션에 저장하는 정보가 사용자와 관련된 데이터라고 가정합니다. 사용자의 데이터는 어딘지 데이터베이스에서 차례로 꺼내집니다. 그렇다면 내가 권장하는 해결책은 다음과 같습니다.

사용자가 Remember Me 옵션을 선택할 때 설정 한 쿠키는 데이터베이스에서 같은 사용자를 다시 찾을 수있는 값을 포함해야합니다. 로그인 할 때 제공 한 자격 증명을 통해 해당 사용자를 찾은 경우와 동일한 방식으로 세션을 인스턴스화 할 수 있습니다. 유감스럽게도 (쉬운 일은 아니지만) 쉬운 방법으로 사용자 정보에 대한 고유 한 데이터베이스 ID를 저장하는 것이 좋지만 그렇게하지 마십시오!

대신 user_id, session_id, expire_time의 세 열을 포함하는 sessions라는 테이블을 만듭니다. 사용자가 로그인 할 때 'Remember Me'비트를 true로 설정하면 사용자 ID, 세션 ID (session_id() 함수를 호출하여 얻을 수 있음) 및 원하는 시간을 저장할 수 있습니다. '기억 된'세션이 만료되었습니다.

<?php 
    function persist_session(){ 
    $user_id  = $_SESSION['user']->id; 
    $session_id = session_id(); 
    $expire_time = time() + (60 * 60) * 24; // 24 hours 
    $sql   = "INSERT INTO sessions (user_id, session_id, expire_time), VALUES ($user_id, $session_id, $expire_time)"; 
    mysqli_query($sql); // This assuming you've already set up your DB connection and so on 
    $_COOKIE['session_id'] = $session_id; // Write the persisted session ID to a cookie 
    } 
?> 

이것은 정말 완전한 예제되지 않습니다 : 당신이 당신의 세션에 데이터를 추가하고 사용자가 로그인, 당신은 다음이 유사한 함수를 호출 할 수 있습니다

. 우선, 한 번에 둘 이상의 세션이 테이블에 지속되는 사용자가 없도록하기 위해 몇 가지 코드를 작성하는 것이 좋지만 그만큼 간단합니다 ...

세션 정보를 유지하고 나중에 참조 쿠키에 기록, 쿠키에서 사용자 정보를 가져 오는 것은 매우 간단합니다 :

<?php 
    function reinstantiate_session(){ 
     if(isset($_COOKIE['session_id')){ 
     $session_info = mysqli_fetch_object(mysqli_query("SELECT * FROM sessions WHERE session_id = '{$_COOKIE[session_id]}'")); 
     if($session_info){ 
      $_SESSION['user_id'] = $session_info->user_id; 
     } 
     } 
    } 
?> 

다시 말하지만,이 예제는 ... 당신은 처리 할 것입니다 수만큼 완전하지 않습니다 오류가 발생할 수 있으며 특히 만료 된 정보를 제외하기 위해 find sql을 업데이트해야 할 수도 있습니다.하지만 시작하기에 충분할 것입니다!