2012-02-25 61 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