php - SessionHandlerInterface 写方法替代方案

标签 php mysql session

我正在为 SessionHandlerInterface 类 使用以下写入方法:

public function write($session_id, $session_data) {
    $sth = DBCxn::get()->prepare("UPDATE sessions SET session_data = ?, last_update = NOW() WHERE session_id = ?");
    $sth->execute(array($session_data, $session_id));
    if ($sth->rowCount() == 0) {
        $sth = DBCxn::get()->prepare("INSERT INTO sessions (session_id, session_data, last_update) VALUES (?, ?, NOW())");
        $sth->execute(array($session_id, $session_data));           
    }

问题在于,如果更新查询的session_data没有改变,rowCount()会返回0,反过来函数会尝试插入一个 session_id 已经存在并返回错误。

我想做一个选择查询来验证 session_id 是否存在的解决方案。

还有哪些替代方法可以用来解决这个问题?

最佳答案

read()write() 之前调用(在 session 开始时),您将有一个 SELECT 查询在那里。

因此,您已经知道是否应该执行 INSERTUPDATE - 只需使用一个属性作为“行存在”标志,这是您从内部设置的read(),您稍后可以在 write() 中检查它。

关于php - SessionHandlerInterface 写方法替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158792/

相关文章:

php - 使用户能够收藏帖子

javascript - 显示 session 变量而不刷新页面

Java Soap Glassfish 登录后获取 session

php - 无法打开流 : Is a directory in

php - Laravel:未获取所需数据

mysql - 我可以在 MySQL 中使用 JSON_EXTRACT 进行不区分大小写的搜索吗?

mysql - 从另一个表中获取两个用户共有的行

php - 为什么 `FILTER_VALIDATE_NUMBER_FLOAT` 常量会去掉小数位字符?

php - 在Eclipse中搭建PHP开发环境

ruby-on-rails - Redis 存储中的动态 session key 取决于请求域