[英]Problems with serialize() and unserialize() - inserting and selecting data PHP MySQL
我試圖獲取通過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文件在這里-選擇並反序列化:
$result = mysql_query("SELECT Programme_Dates FROM programme");
while($row = mysql_fetch_array($result))
{
$dates = unserialize($row["Programme_Dates"]);
echo $dates;
}
從我所讀的內容來看,問題可能與插入序列化數組的DB列有關(即,它太小了),但是它設置為TEXT,所以應該沒事吧? 我還認為日期內可能有某些字符會引起問題,但是在使用“常規”數組(即僅文本)進行測試時,會遇到相同的錯誤。
任何建議/提示非常感謝,謝謝。
為什么要使用反斜杠? 我敢打賭,這就是問題所在。 從那里刪除它,看看是否可行。
附帶說明一下,應避免使用反斜杠,因為數據很可能已插入數據庫中,因此應正確轉義,這意味着不應添加額外的斜杠。 如果您需要從數據本身中去除反斜杠 ,我建議您在對數組進行反序列化后使用諸如array_filter之類的東西。
編輯
您還應該研究SQL注入以及如何防止它,因為您的代碼很容易被利用。
UPDATE
進一步查看您的代碼,您將在序列化數組中插入2個額外的空格: ' ".$savetodb." ',
' ".$savetodb." ',
嘗試僅使用'".$savetodb."',
然后查看是否可以解決您的問題。
我發現將存儲到數據庫的序列化值轉換為其他方式的格式。 由於序列化數據存儲用引號,分號,副詞括號括起來,因此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));
nb:我已經嘗試過並且可以正常工作,請確保避免將這種類型的數據存儲在表中(有風險)。 這種方式也可以解決存儲在表中的json格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.