0

0

跨页面读取数据库session失败

php中文网

php中文网

发布时间:2016-06-23 14:03:33

|

1082人浏览过

|

来源于php中文网

原创

要疯了。。三天了。。一个问题就是搞不定。不知道问谁去。
问题如下:
我在set_session_test.php中注册的session无法再get_session_php中读取,也就是只能读取当天页面的session。。。为神马???求神人解释。高分求救。



数据库结构如下:

conf.php

  

final_session.php
Mysql Error:".mysql_errno()."";		die();	}		if(!mysql_select_db($gb_DBname)){		echo "
  • Mysql Error:".mysql_errno()."
  • "; die(); } return true;}function sess_close(){ return true;}function sess_read($key){ global $SESS_DBH,$SESS_LIFE; $qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time(); $qid = mysql_query($qry, $SESS_DBH); if(list($value) = mysql_fetch_row($qid)){ return $value; } return false;}function sess_write($key, $val){ global $SESS_DBH,$SESS_LIFE; $expiry = time()+$SESS_LIFE; $value = $val; $qry = "INSERT INTO db_session VALUES('$key', $expiry, '$value')"; //echo $qry; $qid = mysql_query($qry,$SESS_DBH); if(!$qid){ $qry = "UPDATE db_session SET expiry=$expiry,value='$value' WHERE sesskey='$key' and expiry>".time(); $qid = mysql_query($qry); } return $qid;}function sess_destory($key){ global $SESS_DBH; $qry = "DELETE FROM db_session WHERE sesskey = '$key'"; $qid = mysql_query($qry, $SESS_DBH); return $qid;}function sess_gc($maxlifetime){ global $SESS_DBH; $qry = "DELETE FROM db_session WHERE expiry<".time(); $qid = mysql_query($qry, $SESS_DBH); return mysql_affected_rows($SESS_DBH);}session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");


    set_session_test.php
    显示SESSION";?>


    get_session_test.php

    Upscale
    Upscale

    AI图片放大工具

    下载

    回复讨论(解决方案)

    session_set_save_handler()
    注意:使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

    session_set_save_handler()
    注意:使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

    有试过。。也用ini_set()函数设置了。。结果依然是这样的。。。数据库中是有session写入的。。

    if(list($value) = mysql_fetch_row($qid)){
    ????

    你查询的是全部字段,为什么只取出第一个?
    那不是 sessionid 吗?

    把sess_read里的

    $qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();

    换成
    $qry = "SELECT value FROM db_session WHERE sesskey = '$key' and expiry > ".time();

    就可以了。 

    你试用cookie看可以解决你的问题吗。

    楼主$_SESSION['message'] = "Can I help you?";
    输出变量看看。echo $_SESSION['message'];

    .......
    试了了一下 楼主的代码 ...

    依然木有正解。

    难道木有高人了?

    这比我那个页内传值的问题高深多了,我只不过想把表单输入的内容都存储下来 ,想什么时候用旧什么时候用,这个功能比我那个全多了。。。时刻关注。

    还有一处

    function sess_write($key, $val){    global $SESS_DBH,$SESS_LIFE;        $expiry = time()+$SESS_LIFE;    $value = $val;    $qry = "REPLACE INTO db_session VALUES('$key', $expiry, '$value')";    $qid = mysql_query($qry,$SESS_DBH);}

    好的。。我去试下。。但感觉应该不是这个问题。。因为session已经成功写入。。是读取的问题。

    还有一处
    PHP code
    function sess_write($key, $val){
        global $SESS_DBH,$SESS_LIFE;
        
        $expiry = time()+$SESS_LIFE;
        $value = $val;
        $qry = "REPLACE INTO db_session VALUES('$key', $expiry, ……

    还是不行。。。不过学会了REPLACE的用法。。受教了。

    等待高人解决。。另外本人贴张图上来。好让大家明白究竟什么样的存储结构。


    好的。。我去试下。。但感觉应该不是这个问题。。因为session已经成功写入。。是读取的问题。

    引用 11 楼  的回复:

    还有一处
    PHP code
    function sess_write($key, $val){
    global $SESS_DBH,$SESS_LIFE;

    $expiry = time()+$SESS_LIFE;
    $value = $val;
    $qr……

    加分悬赏。提供正解者。加分100.

    SESSIONID($key)是保存在COOKIE里的,有没有设置它的保存时间呢?
    能确保再次访问的时候能拿到跟前次访问相同的$key?

    怎么还没搞好呢?
    这是我改写的你的代码。
    因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名

    Mysql Error:".mysql_errno()."";        die();    }    define("SESS_DBH", $conn);    if(!mysql_select_db(DBNAME, SESS_DBH)){        echo "
  • Mysql Error:".mysql_errno()."
  • "; die(); } return true;}function sess_close(){ return true;}function sess_read($key){ $qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time(); $qid = mysql_query($qry, SESS_DBH) or die(mysql_error()); $r = mysql_fetch_assoc($qid); return $r['value'];}function sess_write($key, $val){ $expiry = time()+SESS_LIFE; $value = $val; $qry = "REPLACE INTO sessions VALUES('$key', $expiry, '$value')"; $qid = mysql_query($qry, SESS_DBH);}function sess_destory($key){ $qry = "DELETE FROM sessions WHERE sesskey = '$key'"; $qid = mysql_query($qry, SESS_DBH); return $qid;}function sess_gc($maxlifetime){ $qry = "DELETE FROM sessions WHERE expiry<".time(); $qid = mysql_query($qry, SESS_DBH); return mysql_affected_rows(SESS_DBH);}//session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");session_start();

    sess_read里的  

      if(list($value) = mysql_fetch_row($qid)){        return $value;    }

    错了,只需要返回session的序列化串,也就是表内的value字段,改成
        if($value = mysql_fetch_row($qid)){        return $value[2];    }

    严重感谢。。。代码测试可以正常运行。。但我还是想知道是神马毛病。
    怎么还没搞好呢?
    这是我改写的你的代码。
    因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名
    PHP code
    define("DBHOST", "localhost");
    define("DBUSER", "root");
    define("DBPSW", "");
    define("DBNAME", "test");
    define("PAGENUM",10);
    defi……

    那段代码木有问题。。测试过。。换了结果还是一样的。
    sess_read里的  
    PHP code
      if(list($value) = mysql_fetch_row($qid)){
            return $value;
        }

    错了,只需要返回session的序列化串,也就是表内的value字段,改成
    PHP code
        if($value = mysql_fetch_row($qid)){
            re……

    100分送你了。。。稍等我看下能不能找出什么毛病。。这两天就结贴。
    怎么还没搞好呢?
    这是我改写的你的代码。
    因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名
    PHP code
    define("DBHOST", "localhost");
    define("DBUSER", "root");
    define("DBPSW", "");
    define("DBNAME", "test");
    define("PAGENUM",10);
    defi……

    因为你的表中的sesskey列没有设为主键或惟一约束,所以在每次在session_start();会产生一个一样的SID,把数据库表sesskey列设置为主键或惟一键即可解决。

    注:你多刷新几次你的测试代码,然后去数据库查一下会发现有多个重复的SID

    我的数据库是有设主键的。。你说的情况我明白。但不是这种情况。
    我有个回帖里面也提到了这个问题。
    数据库的写入是没有问题的。。可以正常插入。

    但是你设的主键是不是(sesskey和expiry),而不是sesskey吧???

    不是组合主键。。。主键只有sesskey....
    但是你设的主键是不是(sesskey和expiry),而不是sesskey吧???

    问题可能出在:

    function sess_read($key){
        $qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();

    你把$qry打印出来,看看能不能取到?

    sess_read里的  

    数据库读出来后 只能返回value字段里面的数据! 不能返回整条数据

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    全国统一发票查询平台入口合集
    全国统一发票查询平台入口合集

    本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

    11

    2026.02.03

    短剧入口地址汇总
    短剧入口地址汇总

    本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

    18

    2026.02.03

    植物大战僵尸版本入口地址汇总
    植物大战僵尸版本入口地址汇总

    本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

    10

    2026.02.03

    c语言中/相关合集
    c语言中/相关合集

    本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

    2

    2026.02.03

    漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
    漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

    本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

    8

    2026.02.03

    Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
    Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

    本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

    88

    2026.02.03

    Java 设计模式与重构实践
    Java 设计模式与重构实践

    本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

    2

    2026.02.03

    C# 并发与异步编程
    C# 并发与异步编程

    本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

    2

    2026.02.03

    Python 强化学习与深度Q网络(DQN)
    Python 强化学习与深度Q网络(DQN)

    本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

    2

    2026.02.03

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号