【发布时间】:2012-02-25 23:03:43
【问题描述】:
我正在建立一个网站,该网站存储特定于每个用户的大型(序列化)数组数组。对大数组进行序列化,然后将数据库更新为其新值。此外,新数组被添加到 $_SESSION[] 数组中,该数组用于用户登录期间。我可以在大数组中使用最多 4 个这样的数组来更新数组,但之后数据不会似乎正确更新。
即使在添加了第三个数组并且 $_SESSION[] 数组似乎包含所有正确的数据之后,MySQL UPDATE 查询也会返回 1,但是当用户注销然后再次登录时,数组似乎不是在用户登录时复制到 $_SESSION[] 数组。如果只有 4 个这样的数组存储在大数组中,则可以从数据库中获取数据没有问题。我将数据库字段的长度增加到超出所需的长度(然后将其增加到超出所需的长度),但没有帮助。
当我转到 phpMyAdmin 时,我可以看到数组已成功更新,直到数组 3 之后序列化数组突然停止(在序列化数组的句子中间),但我认为这可能是 phpMyAdmin 的问题因为在数组编辑框旁边它说“由于它的长度,这个字段可能不可编辑”所以也许 phpMyAdmin 只是不想将数组的其余部分加载到微小的文本区域中。
有什么办法可以解决这个问题吗?有什么我可能不知道的吗(我是 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());
'reports' 和 'email' 数组元素并不真正相关。
用于从数据库中检索数组的代码如下:
$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']);
}
另外,对不起,我在上述问题中使用了大约 25 次“数组”这个词 :)
【问题讨论】:
-
数据库中的模板是什么类型的字段?您还应该能够通过查看(而不是编辑)来检查 phpMyAdmin 中的数据,然后单击图标以展开截断的文本字段(如下所示:-> T
-
与mysql的“max_allowed_packet”设置相比,这个数据块有多大?
-
字段类型为文本。我不知道“max_allowed_packet”设置——这可能是问题所在。我怎样才能改变它?
-
文本类型有一个maximum length of 65535 字符,也许你打到了?
-
是的,这正是我拥有的字符数。有什么办法绕过这个限制?