【发布时间】:2011-08-11 16:35:45
【问题描述】:
我在尝试反序列化 PHP 中的数组时遇到了一些问题。
我在一个类中有两种方法,一种用于在 mysql 表中存储序列化数组,另一种用于检索它。
执行第二种方法时(检索/反序列化时)出现以下错误:
注意:unserialize():第 39 行 /Users/benwaine/NetBeansProjects/SentimentEngineMk2/lib/TSE/Mapper/Filter.php 中 50647 字节的偏移 50623 处出错
字符串存储在 MySQL 的 blob 字段中。该数组是多维的,由带有浮点数组的标记组成。问题是间歇性的,可能表明问题出在令牌上?
// 结构 关键字A - 0.234 - 0.234 关键字B - 0.23 - 0.47 // 方法 公共函数 insertFilterForKeyword($id, 数组 $filterProbs) { $sql = "插入过滤器 (keyword_id, filter_probs, sample_size_pos, sample_size_neg) 值(:id,:filterProbs,:pos,:neg)“; $stmt = $this->pdo->prepare($sql); $meta = array_shift($filterProbs); $stmt->bindParam(':id', $id); $stmt->bindParam(':filterProbs',serialize($filterProbs)); $stmt->bindParam(':pos', $meta['sample_size_pos']); $stmt->bindParam(':neg', $meta['sample_size_neg']); $result = $stmt->execute(); 返回$结果; } 公共函数 getFilterByKeyword($keyword) { $sql = 'SELECT f.id, f.keyword_id, f.filter_probs, f.sample_size_pos, f.sample_size_neg FROM 过滤器 f 加入关键字 k ON k.id = f.keyword_id WHERE k.keyword = :keyword'; $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':keyword', $keyword); $result = $stmt->execute(); $data = $stmt->fetch(PDO::FETCH_ASSOC); $probArray = unserialize($data['filter_probs']); $filter = new TSE_Filter($probArray); 返回$过滤器; }我猜这个错误与数据中导致反序列化问题的字符有关。
在谷歌搜索后,我尝试了以下方法的反序列化行,但都没有奏效:
1) base64_encode / 解码序列化字符串。
//安全序列化 $safe_string_to_store = base64_encode(序列化($multidimensional_array)); //反序列化... $array_restored_from_db = unserialize(base64_decode($encoded_serialized_string));2) 使用预匹配来改变潜在的困难字符:
反序列化(preg_replace('/;n;/', ';N;', strtolower($data['filter_probs'])));任何帮助将不胜感激!
谢谢。
【问题讨论】:
-
您能否发布一个示例,说明当您从数据库中查询而不尝试反序列化时序列化数据的样子?
标签: php mysql serialization