2010-08-13 60 views
0

我试图抓住一个通过POST提供的日期,然后从提供的开始日期生成一个12周的日期列表。这些日期将进入数据库并输出一个12周的时间表,用户可以与之交互(添加/编辑/删除)。serialize()和unserialize()的问题 - 插入和选择数据PHP MySQL

我成功地服用的开始日期,产生12周日期列表和序列化形式加入到这个数据库,但是当谈到选择的日期显示,我收到以下错误:

Notice: unserialize() [function.unserialize]: Error at offset 0 of xxx bytes in ... 

这里是我的代码:

1 .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这里的文件 - 选择和反序列化:

$result = mysql_query("SELECT Programme_Dates FROM programme"); 

while($row = mysql_fetch_array($result)) 
    { 
    $dates = unserialize($row["Programme_Dates"]); 
    echo $dates; 

    } 

从我读过的问题可能涉及到数据库列其中序列化数组被插入(即太小),但它被设置为TEXT,所以应该是正确的?我也认为日期内可能会有某些字符导致问题,但是当用“常规”数组(即文本)进行测试时,我会得到相同的错误。

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

+0

你为什么叫'stripslashes'?你是否在运行魔术引号?你的代码似乎也容易受到[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)的影响。 – Charles 2010-08-13 17:56:22

+0

哎呀是的,不应该在那里 - 编辑,谢谢 – Dave 2010-08-13 17:57:51

+0

你有没有检查数据库中的实际内容?从数据库中读取数据后,是否检查过$ row [“Programme_Dates”]的值?它们是否与您认为放入数据库的内容相符? – Craig 2010-08-13 18:05:19

回答

2

你为什么使用stripslashes?我敢打赌,这是问题所在。从那里删除它,看看它是否有效。

作为一个附注,应该避免反斜杠,就好像数据可能被插入到数据库中一样,它们应该被正确地转义,这意味着不应该添加额外的斜线。如果你需要从数据本身反斜杠,我会建议使用array_filter之后你反序列化数组。

编辑

你也应该看看SQL注入以及如何预防它,因为你的代码是suseptible被利用。

UPDATE

看你的代码还插入有2个额外的空间序列化数组:' ".$savetodb." ',尝试使用刚刚'".$savetodb."',这一点,看看是否能够解决您的问题。

+0

谢谢 - stripslashes删除(不应该在那里摆在首位)。尽管如此,仍然有相同的错误 – Dave 2010-08-13 17:59:34

+0

请参阅关于额外空间的声明。 – 2010-08-13 18:01:50

+0

好了,现在我们正在某个地方!删除多余的空间建议修复错误。现在我得到“阵列”而不是日期 - 现在应该调查。非常感谢! – Dave 2010-08-13 18:05:19

0

我发现存储到数据库的序列化值被转换为其他格式。由于serialize数据存储引号,分号,culry括号,mysql需要自行保存,所以它会自动放入来自gpc_magic_quotes(CMIIW)的“backslash()”。所以如果你存储了一个序列化数据并且你想使用它,那么在接口中你应该使用html_entity_decode()来确保你有PHP读取的实际格式。

这里是我的示例:

$ser = $data->serialization; // assume it is the serialization data from database 
$arr_ser = unserialize(html_entity_decode($ser)); 

注:我尝试它和它的作品,并确保避免这种类型的存储在表(到危险)。这种方式也可以解决表中存储的json格式。