为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复已被错误字节计数长度损坏的序列化字符串?

如何修复已被错误字节计数长度损坏的序列化字符串?

GCT1015 2019-07-06 15:43:27
如何修复已被错误字节计数长度损坏的序列化字符串?我使用的是Hotaru CMS和图像上传插件,如果我试图将图像附加到一个帖子中,我会得到这个错误,否则没有错误:取消序列化()[功能.非序列化]:在偏移量处出错违规代码(错误点指向*):/**      * Retrieve submission step data      *      * @param $key - empty when setting      * @return bool      */     public function loadSubmitData($h, $key = '')     {         // delete everything in this table older than 30 minutes:         $this->deleteTempData($h->db);         if (!$key) { return false; }         $cleanKey = preg_replace('/[^a-z0-9]+/','',$key);         if (strcmp($key,$cleanKey) != 0) {             return false;         } else {             $sql = "SELECT tempdata_value FROM " . TABLE_TEMPDATA . " WHERE tempdata_key = %s ORDER BY tempdata_updatedts DESC LIMIT 1";             $submitted_data = $h->db->get_var($h->db->prepare($sql, $key));             **if ($submitted_data) { return unserialize($submitted_data); } else { return false; }**          }     }数据从表,注意结束位有图像信息,我不是一个PHP专家,所以我想知道你们这些家伙/女孩可能会怎么想?temdata_value:a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_ content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15 :"submit_comments";s:4:"open";s:5:"image";s:19:"C:fakepath100.jpg";}编辑:我想我找到了序列化的部分./**      * Save submission step data      *      * @return bool      */     public function saveSubmitData($h)     {         // delete everything in this table older than 30 minutes:         $this->deleteTempData($h->db);         $sid = preg_replace('/[^a-z0-9]+/i', '', session_id());         $key = md5(microtime() . $sid . rand());         $sql = "INSERT INTO " . TABLE_TEMPDATA . " (tempdata_key, tempdata_value, tempdata_updateby) VALUES (%s,%s, %d)";         $h->db->query($h->db->prepare($sql, $key, serialize($h->vars['submitted_data']), $h->currentUser->id));         return $key;     }
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我没有足够的声誉来发表评论,所以我希望使用上述“正确”答案的人能看到这一点:

由于php5.5,preg_reve()中的/e修饰符已被完全废弃,上面的preg_Match将出错。php文档建议在其位置使用preg_match_callback。

请找到以下解决方案,作为上述建议的preg_match的替代方案。

$fixed_data = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {      
    return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';},$bad_data );


查看完整回答
反对 回复 2019-07-06
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

还有另一个原因unserialize()失败,因为您不正确地将序列化的数据放入数据库(请参阅官方解释这里。自serialize()返回二进制数据和php变量不关心编码方法,因此将其放入文本中,VARCHAR()将导致此错误。

解决方案:将序列化的数据存储到表中的BLOB中。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 589 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信