2010-08-13 61 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格式。