Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP序列化数据存储在mysql数据库错误_Php_Mysql_Mariadb - Fatal编程技术网

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

PHP序列化数据存储在mysql数据库错误,php,mysql,mariadb,Php,Mysql,Mariadb,我有一个基于数据库的会话存储解决方案。很好!但是,我对它存储特定类型的数据有一个问题 我有一个使用CSRF令牌的应用程序。创建表单时,它将为该表单创建一个令牌。令牌是不同类型值的散列(sha256)值。一个副本进入表单,另一个副本存储在会话中。提交表单后,它会比较令牌以确保它们匹配 下面是使用新数据更新数据库的析构函数示例 UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id array(2) {

我有一个基于数据库的会话存储解决方案。很好!但是,我对它存储特定类型的数据有一个问题

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

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

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"
}
Update语句很好,工作正常。这是我遇到的问题,数据已更新,但是您在上面的数据中看到的“令牌”值与下面的db中的值不同(这是数据的二进制下载):

看起来mysql正在改变这个值,我一辈子都无法解决这个问题。我尝试过的解决方案包括:

  • 序列化
  • json_编码
  • 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
);

有什么突然出现在我脑海中的原因吗?

你看过数组的
时间
索引了吗?它似乎也改变了。这让我觉得保存会话的方法至少执行了两次。第二次更新会话并覆盖旧值

在附加了调试器的情况下运行此代码,或者在每次调用函数时打印/记录堆栈跟踪。这会让您很好地了解值何时再次更新


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

好。因此,在进一步调查并接受所有人的输入后(顺便说一句,干杯)。我解决了我的问题


事实证明,它与mysql毫无关系。它实际上与“favicon.ico”有关。我和你一样使用花哨的URL,因为我在开发中,我从来没有为favicon烦恼过。默认情况下,在加载页面时,它会尝试查找favicon()。系统假设用户正在尝试访问控制器(我使用mvc)由于控制器不存在,它会重定向到主页。主页需要生成一个令牌,因为它上面有一个表单,因此它会在第二次生成一个令牌,使原始令牌无效。这是我通过开发者控制台查看所有网络连接后意识到的。

我不认为MySQL正在更改您的值。您必须在php代码中为更新提供不同的字符串…您正在为更新使用准备好的语句…请在update语句之前尝试一个
echo$tokenValue;
来验证值update语句之后看到的数组是执行d之前绑定参数的转储b查询。使用
Text
作为类型,它可能无法解决问题,但这是一个解决问题的建议。我面对了它。此外,以下代码取自我的一个工作项目
$this->attributes['options']=base64_编码(序列化($options));
用于读取
返回非序列化(base64_解码($options))
。我会尝试一下。只是出于兴趣,添加base64不会给服务器增加更多负载吗?还是可以忽略?是的,我在尝试寻找解决方案后注意到了。我已经解决了我的问题。不,更新是在析构函数中。干杯
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
);