我正在尝试获取通过POST提供的日期,然后从提供的开始日期生成12周内的日期列表。这些日期将进入数据库,并输出一个12周的时间表,用户可与之交互(添加/编辑/删除)。
我成功地获取了开始日期,生成了12周的日期列表并以序列化形式将其添加到数据库中,但是当选择显示日期时,我收到以下错误:
Notice: unserialize() [function.unserialize]: Error at offset 0 of xxx bytes in ...
这是我的代码:
此处的第一个.php文件接受表单输入(日期),然后从开始日期获取12周内每个日期的列表,并插入到数据库中:
数组:
$start = strtotime($_POST['Start_Date']);
$dates=array();
for($i = 0; $i<=84; $i++)
{
array_push($dates,date('Y-m-d', strtotime("+$i day", $start)));
}
$savetodb = serialize($dates);
插入:
$sql = "INSERT INTO programme VALUES (NULL, '20', '".$_POST["Start_Date"]."' , ' ".$savetodb." ', '".$_POST["Programme_Notes"]."')";
第二个.php文件 - SELECT和unserialize:
$result = mysql_query("SELECT Programme_Dates FROM programme");
while($row = mysql_fetch_array($result))
{
$dates = unserialize($row["Programme_Dates"]);
echo $dates;
}
从我所看到的问题可能与插入序列化数组的DB列有关(即太小),但它被设置为TEXT所以应该没问题呢?我还认为日期中可能会有某些字符导致问题,但是当使用“常规”数组(即只是文本)进行测试时,我会得到相同的错误。
任何建议/提示非常感谢,谢谢。
答案 0 :(得分:2)
你为什么使用stripslashes?我敢打赌,这就是问题所在。从那里删除它,看看它是否有效。
作为旁注,应避免使用stripslashes,就像数据可能已插入数据库一样,它们应正确转义,这意味着不应添加额外的斜杠。如果您需要从数据本身中删除条带,我建议您使用array_filter 之后的内容来反序列化数组。
修改强>
您还应该研究SQL注入以及如何防止它,因为您的代码很容易被利用。
<强>更新强>
进一步查看代码,您可以插入带有2个额外空格的序列化数组:' ".$savetodb." ',
尝试使用'".$savetodb."',
,然后查看它是否修复了您的问题。
答案 1 :(得分:0)
我发现存储到数据库的序列化值转换为其他一些格式。由于序列化数据存储引号,分号,culry括号,mysql需要自己保存,所以它会自动放入来自gpc_magic_quotes(CMIIW)的“反斜杠()”。因此,如果您存储序列化数据并且想要使用它,则应在界面中使用html_entity_decode()以确保您具有PHP读取的实际格式。
这是我的样本:
$ser = $data->serialization; // assume it is the serialization data from database
$arr_ser = unserialize(html_entity_decode($ser));
nb:我已经尝试了它并且确实可以避免将这种类型存储在表格中(有风险)。这种方式也可以解决存储在表中的json格式。