mysql-session_regenerate_id和数据库处理程序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-session_regenerate_id和数据库处理程序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2090字,纯文字阅读大概需要3分钟。
内容图文
![mysql-session_regenerate_id和数据库处理程序](/upload/InfoBanner/zyjiaocheng/880/a619125357c64a92a8ff45144b700340.jpg)
我正在为会话使用数据库处理程序,它可以正常工作,但是现在我在身份验证方面遇到了问题.
当用户使用用户名/密码登录时,我执行session_regenerate_id,然后尝试选择当前的session_id.
这是我的代码
session_regenerate_id();
echo $checkQ=" SELECT * FROM my_sessions WHERE id='".session_id()."' ";
......
但我没有任何结果. session_id是正确的.
完成加载页面后,将SQL命令复制粘贴到phpMyAdmin中,我得到结果.
我知道那是愚蠢的,但我能想到的唯一原因是session_regenerate_id()太慢了,因此当我尝试在下一行读取session_id时,session_id尚未在数据库中创建.
谁能帮我!
解决方法:
我知道已经有一段时间了,希望自从发布以来您已经找到了答案,但是为了后代,我将添加我的解决方案.
对session_generate_id()的调用将导致session_id()的值更改:
<?php
$before = session_id();
session_regenerate_id();
$after = session_id();
var_dump($before == $after); // outputs false
这个问题对我来说很明显,因为在会话写处理程序中我正在这样做(当然,没有这样的虚假方法名):
<?php
class MySQLHandler
{
function read($id)
{
$row = $this->doSelectSql($id);
if ($row) {
$this->foundSessionDuringRead = true;
}
// snip
}
function write($id, $data)
{
if ($this->foundSessionDuringRead) {
$this->doUpdateSql($id, $data);
}
else {
$this->doInsertSql($id, $data);
}
}
}
如果从未调用session_regenerate_id(),则write()方法可以正常工作.但是,如果调用了它,则write()的$id参数与传递给read()的$id有所不同,因此更新不会找到带有新$id的任何记录,因为它们从未被插入过.
有人建议使用MySQL的“ REPLACE INTO”语法,但这会删除并替换行,如果您要创建日期列,则会对行造成严重破坏.我要解决的问题是保留传递给读取的会话ID,然后在写入过程中使用传递给读取的ID作为键在数据库中更新会话ID:
<?php
class MySQLHandler
{
function read($id)
{
$row = $this->doSelectSql($id);
if ($row) {
$this->rowSessionId = $id;
}
// snip
}
function write($id, $data)
{
if ($this->rowSessionId) {
$stmt = $this->pdo->prepare("UPDATE session SET session_id=:id, data=:data WHERE session_id=:rowSessionId AND session_name=:sessionName");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':rowSessionId', $this->rowSessionId);
$stmt->bindValue(':data', $data);
$stmt->bindValue(':sessionName', $this->sessionName);
$stmt->execute();
}
else {
$this->doInsertSql($id, $data);
}
}
}
内容总结
以上是互联网集市为您收集整理的mysql-session_regenerate_id和数据库处理程序全部内容,希望文章能够帮你解决mysql-session_regenerate_id和数据库处理程序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。