得,今天来说说PHP里头那个session_start()
的事儿。这玩意儿,我刚开始搞PHP那会儿也琢磨过一阵子。
起因是啥?
就是我自个儿在那儿写代码测试,发现有时候好像不写session_start()
,直接用那个$_SESSION
数组,比如$_SESSION['name'] = '张三'
,好像也能存进去东西,当时就有点懵,网上不都说用session前必先session_start()
吗?难道是骗人的?
我的实践过程
本着实践出真知的想法,我就开始折腾。
- 第一步:我先建个PHP文件,比如叫 `set_*`。里头就简单写一句
$_SESSION['test_data'] = '这是我存的数据';
,然后我试着输出这个变量,看看当时能不能读出来。确实,在当前这个页面,立马就能读出来。 - 第二步:我又建个文件,叫 `get_*`。想着从这个文件里去把我刚才在 `set_*` 里存的那个 'test_data' 给读出来。结果一访问这个 `get_*`,坏,啥也没有,空的!或者直接报错说 `$_SESSION` 未定义。
- 第三步:这时候我就有点明白,光在当前页面设置好像不行,得让PHP知道要“维持”这个状态,得跨页面也能认出来是同一个用户。我就回去翻资料,人家都说
session_start()
是干这个的,它会检查浏览器有没有带过来一个叫 session ID 的小票据(通常是存在cookie里),有的话就根据这个票据把之前存的东西给找回来,没的话就给这个新来的用户发个新票据,并准备好地方给他存东西。 - 第四步:恍然大悟!于是我老老实实地回到我的 `set_*` 文件,在所有代码(特别是任何输出到浏览器的HTML或者空格)之前,加上
session_start();
。然后又跑到 `get_*` 文件里,同样在最顶上加上session_start();
。 - 第五步:再次测试。先访问 `set_*`,没问题。然后立刻访问 `get_*`。这回成功!那个 '这是我存的数据' 清清楚楚地显示出来。
的理解
绕一圈,搞明白。虽然你可能在同一个脚本里,没写session_start()
也能临时往$_SESSION
数组里塞东西(PHP可能比较宽容,允许你先操作数组本身),但这根本没用!因为你没有启动会话机制,PHP压根就没打算帮你记住这些数据,更别说在用户下次请求或者访问其他页面的时候把数据恢复回来。
session_start()
这函数,就像是你要去银行保险库取东西,你得先跟银行说一声,让他们把你的保险箱给你准备核对你的身份(session ID),然后你才能往里存取东西。你不说一声(不调用session_start()
),直接对着空气说“我要存个东西”,银行(PHP服务器)根本不知道你是谁,也不知道要把东西存到哪个保险箱里去,更别提下次你来还能找到。
结论就是:只要你的PHP代码打算用session来跨页面存取数据,那就老老实实,必须,一定,在脚本的在使用任何$_SESSION
变量之前,调用session_start()
。别想着偷懒或者自作聪明,不然数据丢都不知道怎么回事儿。这就是我实践下来的经验,希望能帮到大家。
免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。