serialize()和unserialize()的问题 - 插入和选择数据PHP MySQL

时间:2010-08-13 17:54:51

标签: php mysql database

我正在尝试获取通过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所以应该没问题呢?我还认为日期中可能会有某些字符导致问题,但是当使用“常规”数组(即只是文本)进行测试时,我会得到相同的错误。

任何建议/提示非常感谢,谢谢。

2 个答案:

答案 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格式。