2010-03-13 136 views
3

我有數據提交到數據庫的形式,我有一個看起來像這樣的功能:超過內存大小?

//connect 
foreach ($_POST as $key => $value) { 
    $_POST[$key] = mysql_real_escape_string($value); 
} 

現在,當我張貼,有時我,說這樣的錯誤:

允許的268435456個字節存儲器大小耗盡

我想出,當我做斷行,或按在該消息字段中輸入的話就是,當它導致錯誤,否則它工作正常。有任何想法嗎?

+0

你是否同時發佈圖片?你試圖發佈的信息有多大?你確定問題出在你發佈的代碼上嗎?由於代碼看起來很簡單,看起來很奇怪。對於測試,你有沒有嘗試刪除mysql_real_escape_string()調用,例如。與addslashes()。 – 2010-03-14 00:09:20

+0

我認爲PHP將在您的POST集合副本上運行foreach,但它仍然被認爲是不好的做法,修改您實際迭代的集合。 – jishi 2010-03-14 00:17:54

回答

1

請嘗試重現錯誤與

$mysql = mysql_connect(... 

printf("<pre>Debug: count(_POST)==%d</pre>", count($_POST)); 
foreach ($_POST as $key => &$value) { 
    printf("<pre>Debug: strlen(_POST[%s])==%d</pre>", htmlspecialchars($key), strlen($value)); flush(); 
    $value = mysql_real_escape_string($value, $mysql); 
} 
printf("<pre>Debug: Done.</pre>"); 

請問消息「的268435456個字節用盡允許的內存大小」在此之前印刷的東西「不尋常」?

編輯和BTW:我不「喜歡」你想處理real_escape_string啄的原因有兩個方式:獨自如果可能的話

  • 離開彥博,不改變其值。 (雖然;我會爲撤銷magic_quotes作例外)-)
  • 只處理那些你知道你將需要的字段。儘管這聽起來像是一個好主意和超可重用的代碼,但不要編寫「在數據庫中編碼和存儲_POST中的所有東西」函數。如果你想保持一定的可重用性,就可以通過一個數組來描述函數。在該陣列中,您可以存儲信息如[表單域的名稱,允許的數據類型/驗證規則,數據庫字段名稱]