2012-02-25 58 views
0

我正在建立一個網站,它存儲了每個用戶特有的大型(序列化)數組陣列。大數組被序列化,然後數據庫被更新爲它的新值。此外,新的數組被添加到$ _SESSION []數組中,用於用戶登錄期間。我可以更新數組中最多4個這樣的數組,但之後數據不會似乎正確更新。無法獲得太大的MySQL數據

MySQL UPDATE查詢返回1,即使在添加了第3個數組後,$ _SESSION []數組似乎包含所有正確的數據,但當用戶註銷然後再次返回時,數組似乎不會被複制到$ _SESSION []數組,就像它應該在用戶登錄時一樣。如果這些數組中只有4個被存儲在大數組中,那麼可以從數據庫中獲取數據沒有問題。我將數據庫字段的長度增加到了所需的數量之外(然後將它增加到超出應有的要求)但它沒有幫助。

當我去phpMyAdmin,我可以看到數組更新成功,直到數組3之後,當序列化數組突然停止(在序列化數組中的一個句子的中間),但我認爲這可能是一個問題phpMyAdmin,因爲它旁邊的數組編輯框說'因爲它的長度,這個字段可能不可編輯',所以也許phpMyAdmin只是沒有打擾到加載到微小的textarea數組的其餘部分。

有什麼我可以解決這個問題嗎?有什麼我可能沒有意識到的(我是一個初學MySQL的人,但它似乎一直工作到現在爲止)。

用於更新數據庫的代碼是這樣的:

$_SESSION['data']['user']['templates'][$_SESSION['edit']['templateNo']] = $template; 
$serializedTemplates = mysql_real_escape_string(serialize($_SESSION['data']['user']['templates'])); 
$serializedReports = mysql_real_escape_string(serialize($_SESSION['data']['user']['reports'])); 
$email = mysql_real_escape_string($_SESSION['data']['user']['details']['email']); 
$returned = mysql_query("UPDATE rmusers SET templates='$serializedTemplates', reports='$serializedReports' WHERE email='$email'") or die (mysql_error()); 

「報告」和「電子郵件」數組元素是不是真的有關。

用於從數據庫中檢索數組中的代碼是這樣的:

$result = mysql_query("SELECT * FROM rmusers WHERE email='" . $_POST['email'] ."'"); 
$userRow = mysql_fetch_array($result); 
if (strlen(unserialize($userRow['templates'])) > 0) 
{ 
    $_SESSION['data']['user']['templates'] = unserialize($userRow['templates']); 
} 

此外,對不起,我已經使用這個詞「陣」在上面的問題:)

+1

什麼類型的字段是數據庫中的模板?您還應該能夠通過查看phpMyAdmin中的數據(而不是編輯)來檢查數據,然後單擊該圖標以展開截斷的文本字段(如下所示: - > T < - ) – 2012-02-25 23:10:53

+0

這個數據塊的大小是多少到mysql的「max_allowed_pa​​cket」設置? – 2012-02-25 23:13:54

+0

字段類型是文本。我不知道「max_allowed_pa​​cket」設置 - 這可能是問題。我該如何改變它? – 2012-02-25 23:23:13

回答

0

約25倍的字段類型爲text,其最大長度爲65535個字符。切換到longtext,理論極限爲4GB。然而要記住的是,docs說:

LONGTEXT列的有效最大長度還取決於在客戶機/服務器協議和可用的存儲器配置的最大數據包大小。

還請參閱max_allowed_packet設置的文檔:

協議限制max_allowed_pa​​cket的爲1GB。

+0

謝謝。長文字有什麼缺點? – 2012-02-25 23:36:17

+0

「這四種文本類型之間沒有實際的區別」http://stackoverflow.com/questions/7314682/what-is-the-disadvantage-to-using-a-mysql-longtext-sized-field-when-every-條目 – Maerlyn 2012-02-25 23:39:35

+1

您可能需要考慮'LARGEBLOB'(或'MEDIUMBLOB',〜16 MB限制)。 Blob類型是二進制的,這是PHP中的序列化字符串,它可以防止進一步的問題。 – hakre 2012-02-25 23:46:56