gpt4 book ai didi

PHP序列化数据存储在mysql db错误

转载 作者:可可西里 更新时间:2023-11-01 06:49:50 24 4
gpt4 key购买 nike

我有一个基于数据库的 session 存储解决方案。效果很好!但是,我在存储特定类型的数据时遇到了问题。

我有一个使用 CSRF token 的应用程序。创建表单时,它将为该表单创建一个 token 。 token 是不同类型值的哈希 (sha256) 值。一个副本进入表单,另一个副本存储在 session 中。提交表单后,它会比较标记以确保它们匹配。

下面是使用新数据更新数据库的 destruct 函数的示例

UPDATE session_manager SET variables= :variables  WHERE 1=1  AND id = :id
array(2) {
[":variables"]=>
string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}"
[":id"]=>
string(2) "49"
}

更新语句很好并且工作正常。这是我遇到的问题,数据已更新,但是您在上面的数据中看到的“ token ”值与下面的数据库中的值不同(这是数据的二进制下载):

a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}}

看来 mysql 正在更改该值,我终究无法弄清楚这个问题。我尝试过的解决方案包括:

  • 序列化
  • json_encode
  • base64

改变数据库的字符集,什么不是。在数据库中尝试了不同的字段类型,例如 TEXT、Longtext 和 BLOB。这似乎对我不起作用:(

这是数据库的sql

CREATE TABLE session_manager(
id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
session_id VARCHAR(200),
user_agent TINYTEXT NOT NULL,
variables BLOB NOT NULL,
initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
);

想到什么原因?

最佳答案

你看过数组的 time 索引了吗?好像也变了。这让我觉得保存 session 的方法被执行了(至少)两次。第二次更新 session 并覆盖旧值。

在附加调试器的情况下运行此代码,或者在每次调用您的函数时打印/记录堆栈跟踪。当值再次更新时,这应该会给您一个很好的主意。

PS:在您检索值之前,是否会在下一个请求中再次调用更新查询?

关于PHP序列化数据存储在mysql db错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32827594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com