簡體   English   中英

serialize()和unserialize()的問題-插入和選擇數據PHP MySQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM