2010-05-17 3 views
0

UPDATEPHP 세션 전용 (읽기/쓰기를 수행하는 클래스의 코드를 추가) 테이블

<?php 
error_reporting(E_ALL); 

class dbSession 
{ 
    function dbSession($gc_maxlifetime = "", $gc_probability = "", $gc_divisor = "") 
    { 
     if ($gc_maxlifetime != "" && is_integer($gc_maxlifetime)) { 
      @ini_set('session.gc_maxlifetime', $gc_maxlifetime); 
     } 
     if ($gc_probability != "" && is_integer($gc_probability)) { 
      @ini_set('session.gc_probability', $gc_probability); 
     } 
     if ($gc_divisor != "" && is_integer($gc_divisor)) { 
      @ini_set('session.gc_divisor', $gc_divisor); 
     } 
     $this->sessionLifetime = ini_get("session.gc_maxlifetime"); 
     session_write_close(); 

     session_set_save_handler(
      array(&$this, 'open'), 
      array(&$this, 'close'), 
      array(&$this, 'read'), 
      array(&$this, 'write'), 
      array(&$this, 'destroy'), 
      array(&$this, 'gc') 
     ); 
     register_shutdown_function('session_write_close'); 
     @session_start(); 
    } 

    function open($save_path, $session_name) 
    { 
     $mySQLHost = "localhost"; 
     $mySQLUsername = "username"; 
     $mySQLPassword = "password"; 
     $mySQLDatabase = "rst_sessions"; 

     $link = mysql_connect($mySQLHost, $mySQLUsername, $mySQLPassword); 

     if (!$link) { 

      die ("Could not connect to database!"); 

     } 

     $dbc = mysql_select_db($mySQLDatabase, $link); 

     if (!$dbc) { 

      die ("Could not select database!"); 

     } 

     return true; 

    } 

    function close() 
    { 
     mysql_close(); 
     return true; 
    } 

    function read($session_id) 
    { 

     $result = @mysql_query(" 
      SELECT 
       session_data 
      FROM 
       session_data 
      WHERE 
       session_id = '".$session_id."' AND 
       http_user_agent = '".$_SERVER["HTTP_USER_AGENT"]."' AND 
       session_expire > '".time()."' 
     "); 

     if (is_resource($result) && @mysql_num_rows($result) > 0) { 

      // return found data 
      $fields = @mysql_fetch_assoc($result); 
      // don't bother with the unserialization - PHP handles this automatically 
      return $fields["session_data"]; 

     } 
     return ""; 
    } 

    function write($session_id, $session_data) 
    { 

     // first checks if there is a session with this id 
     $result = @mysql_query(" SELECT *FROM session_data WHERE session_id = '".$session_id."'"); 
     if (@mysql_num_rows($result) > 0) 
     { 
      $result = @mysql_query(" UPDATE session_data 
       SET 
        session_data = '".$session_data."', 
        session_expire = '".(time() + $this->sessionLifetime)."', 
        account_id = '" . $_SESSION['account']['account_id'] . "', 
        username = '" . $_SESSION['users']['username'] . "', 
        report_logo_path = '". $_SESSION['path_to_report_logo'] . '/' . $_SESSION['report_logo_img'] . "', 
        report_footer_all = '". $_SESSION['report_footer_all'] . "', 
        report_footer_summary= '". $_SESSION['report_footer_summary'] . "' 
       WHERE 
        session_id = '".$session_id."' 
      "); 

      // if anything happened 
      if (@mysql_affected_rows()) 
      { 
       return true; 
      } 


     } 
     else // if this session id is not in the database 
     { 
      $sql = " 
       INSERT INTO 
        session_data 
         (
          session_id, 
          http_user_agent, 
          session_data, 
          session_expire, 
          account_id, 
          username 
         ) 
        VALUES 
         (
          '".serialize($session_id)."', 
          '".$_SERVER["HTTP_USER_AGENT"]."', 
          '".$session_data."', 
          '".(time() + $this->sessionLifetime)."', 
          '".$_SESSION['account']['account_id']."', 
          '".$_SESSION['users']['username']."'  
         ) 
      "; 

      $result = @mysql_query($sql); 

      if (@mysql_affected_rows()) 
      { 
       // return an empty string 
       return ""; 
      } 

     } 

     // if something went wrong, return false 
     return false; 

    } 

} 
?> 

UPDATE 정보의 일부를 작성 : 나는 PHP에서 줄을 주석 처리했습니다. ini 파일을 사용하여 세션이 DB 대신 파일에 기록되도록하고 session_start()를 올바른 위치에 놓습니다. 그래서 다른 곳에서 코드를 배제 할 수있었습니다. 이 문제는 요구 사항 인 세션을 저장할 데이터베이스를 사용할 때만 발생합니다. 따라서 해결할 수있는 다른 아이디어가 있다면 알려주십시오. 감사.


ORIGINAL POST : 나는 어려움이 나를 도울 수있는 일을 기대하고, 여기에 무슨 일이 일어나고 있는지 알아내는 데 문제.

저는 데이터베이스에 내 세션 정보를 저장하는 php, mysql을 사용하고 있습니다. 앱은 localhost, vista에서만 실행됩니다. php.ini 파일에서 "session.save_handler = files"라인을 주석 처리하고 세션을 처리/쓰기하는 PHP 클래스를 사용하고 있습니다.

내 로그인 프로세스는 다음과 같습니다. 로그인을 통해 로그인 자격 증명을 제출하십시오. php. login.php는 loginprocess.php를 호출합니다. loginprocess.php는 사용자를 확인하고 유효한 세션이 새 세션을 시작하고 세션 변수에 데이터를 추가하면 index.php로 리디렉션됩니다.

여기에 문제가 있습니다. loginprocess.php 페이지에는 $ _SESSION [ 'account_id'] = $ account_id와 같이 설정되는 일련의 세션 변수가 있습니다. 등등.하지만 내가 index.php에 가서 var_dump($_SESSION) 할 때 그것은 단지 "array() empty"라고 말한다. 그러나 var_dump($_SESSION) loginprocess.php에서 리다이렉션 라인 header("Location: ../index.php"); 직전에 세션 변수에 모든 데이터가 표시됩니다. 세션 정보가 저장된 데이터베이스를 보면 session_id 필드, created_ts 필드 및 expires 필드에 데이터가 있지만 session_data 필드에는 아무것도 들어 있지 않으며 과거에는 내 모든 세션 데이터 저장되었습니다.

loginprocess.php에서 세션을 var_dump 할 수 있지만 데이터가 db 테이블에 존재하지 않습니다. 캐시를 사용하고 있습니까? 나는 나의 과자 등등을 맑게했다. 그러나 변화 없음.

왜 세션 ID가 테이블에 기록되지만 실제 세션 데이터는 아닌가?

모든 아이디어는 높이 평가됩니다. 감사.

+0

우리는 세션 데이터를 저장하는 데 사용하는 프로세스에 대해 더 많이 알아야 할 것입니다. 데이타베이스에 세션을 저장하고 있다고 말하면 세션 읽기/쓰기 핸들러가 어떻게 설정되어 있습니까? – Johrn

+0

게시물을 읽기/쓰기를 수행하는 클래스 객체로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다. – Ronedog

답변

0

serialize() 함수를 살펴보고 데이터베이스에 쓰기 전에 사용하는 것이 좋습니다. 그리고 읽을 때 해당 unserialize()

+0

답장을 보내 주셔서 감사합니다. write() 함수에서 나는 $ session_data를 sql 문에서 serialize ($ session_data)로 바꾼 다음 return $ fields [ " session_data "]; 그러나 여전히 같은 것. 나는 그것을 틀린 장소에두고 있나? – Ronedog

1

PHP에서 세션 데이터에 액세스하려면 먼저 session_start가 필요합니다.

+0

각 페이지마다 session_start가 필요합니다. –

+0

클래스에는 객체가 만들어 질 때마다 인스턴스화되는 session_start가 있습니다. 나는 모든 페이지가 인스턴스화 된 객체를 갖도록 만들었지 만 여전히 같은 결과를 보였다. – Ronedog

+0

이전에 헤더 (location ...)를 호출하기 전에 채워지는 세션 변수에 문제가있었습니다. 그냥 작동하지 않았고 견과를 먹을려고했는데 - PHP 헬프 페이지에서 이것을 발견했습니다 : 이것을 시도해주세요. 건배. – ronaldosantana