ホームページ  >  記事  >  バックエンド開発  >  session_set_save_handler() での書き込みの使用に関連する問題

session_set_save_handler() での書き込みの使用に関連する問題

WBOY
WBOYオリジナル
2016-06-13 13:16:171092ブラウズ

session_set_save_handler() での書き込み使用に関する問題
SESSION をデータベースに書き込み、セッション ID が URL に渡されます。

a.php:

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
  require('session.php');

  session_start();
  $_SESSION['test'] = 1;

  echo '<a href="b.php?' . session_name() . '=' . session_id() . '">查看</a>';



b.php
PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
  require('session.php');
  session_start();



session.php:
PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
    ini_set('session.save_handler', 'user');
    ini_set('session.use_cookies', 0);
    
    session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');
    
    $link = null;
    $expiry = 86400;
    
    function open($save_path, $session_name)
    {
        //连接数据库
    }
    
    function close() {
        return true;
    }
    
    function read($sessionId) {
        global $link;
        
        $sessionId = mysql_escape_string($sessionId);
        $time = time();
        $sql = "SELECT value FROM session WHERE session_id='{$sessionId}' AND expiry>{$time}";
        
        $result = mysql_query($sql, $link);
        
        if(@$row = mysql_fetch_row($result, $link)) {
            return $row[0];
        }else {
            return '';
        }
    }
    
    function write($sessionId, $sessionData) {
        global $link, $expiry;
        
        $sessionId = mysql_escape_string($sessionId);
        $sessionData = mysql_escape_string($sessionData);
        $time = time() + $expiry;
        
        $sql = "INSERT INTO session(session_id, value, expiry) VALUES('{$sessionId}', '{$sessionData}', {$time});";
        $result = mysql_query($sql, $link);
        
        if($result) {
            return true;
        }
        
        $sql = "UPDATE session SET value='{$sessionData}', expiry={$time} WHERE session_id='{$sessionId}'";
        $result = mysql_query($sql, $link);
            
        if($result && mysql_affected_rows($link)) {
            return true;
        }else {
            return false;
        }
    }
    
    function destroy($sessionId) {
        global $link;
        
        $sessionId = mysql_escape_string($sessionId);
        
        $sql = "DELETE FROM session WHERE session_id='{$sessionId}';";
        $result = mysql_query($sql, $link);
        
        if($result) {
            return true;
        }else {
            return false;
        }
    }
    
    function gc($maxLifeTime) {
        return true;
    }




これで完了です:
.php を実行すると、SESSION が実際にデータベースに保存されます:
+-------------------------------------+---------- -------- ---------------+--------------+
| 有効期限|
+---------- -------------------+-------------- ---------------- ---+----------------+
| o7olki3vmch3k8bakhk71emco6 | isLogin|i:1;許可|s:0:"" |
+----- -----------------------+------ | -------------------- ------+-----------+

問題は次のとおりです。
a.php のハイパーリンクをクリックして b.php に移動すると、表現されている SESSION 値に渡された sessionID がクリアされます。
+----------------------------+----------+----------- ---+
| 有効期限 |
+----------------------------+--- ----+-------+
| 1344496029 |
+-- --------+----------+----------------+

後で b を実行したときに気づきました。 php ページ、write() メソッドで UPDATE を実行しました:
UPDATE session SET value='', expiry=1344496029 WHERE session_id='o7olki3vmch3k8bakhk71emco6'
しかし、b.php ページの SESSION 操作を変更しませんでした。どうしたの?

皆さんごめんなさい! ! !


-----解決策---------
PHP はセッション変数
の値が変更されたかどうかを認識しないため、常にセッションを書き直す必要があります
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。