注意:Drupal中的unserialize()[function.unserialize]

时间:2012-03-13 12:57:08

标签: drupal drupal-6 error-handling

我的Drupal网站页面上方出现此错误:

  

注意:unserialize()[function.unserialize]:偏移0为32时出错   第559行的C:\ xampp \ htdocs \ irbid \ includes \ bootstrap.inc中的字节

这个错误意味着什么,我该如何解决?

5 个答案:

答案 0 :(得分:3)

这是由变量表中的损坏条目引起的。该表的值是序列化的php值。

有关序列化值的更多信息,请参阅这些:

基本上,如果其中一个值是手动更改的,可能会导致类似这样的事情。

例如,匿名变量的默认值为:

+-----------+------------------+
| name      | value            |
+-----------+------------------+
| anonymous | s:9:"Anonymous"; |
+-----------+------------------+

如果您将值更改为s:9:"Some other value";,则会导致问题。 第一个字符是值的类型。值s表示STRING。然后冒号后跟一个数字表示长度。在这种情况下,单词Anonymous正好是9个字符。但Some other value有超过9个字符。该值中有16个字符,因此正确的方法是s:16:"Some other value";

如果有人将值序列化(没有s:9:"";),那么它也会导致此问题。

过去我遇到过这个问题。我添加了一些调试代码,以找出导致此问题的变量。我添加了这样的东西:

$value = unserialize($variable->value);
if ($value === FALSE) {
    watchdog('unserialize', $variable->name);
}

我将此代码放在导致错误的行之前,然后我再次生成错误,然后我转到Drupal admin http://yoursite.com/admin/reports/dblog中的“Recent Log Entries”并按类型{{1}进行过滤}。

一旦我获得了变量的名称,我就会连接到数据库并执行此查询:

unserialize

我把我在日志中找到的名字。 我查看该值并找出导致此错误的原因,然后修复该值。

我希望这会有所帮助。

答案 1 :(得分:1)

我的问题与UTF-8有关。字符串更短 - 字符方式(因为包含UTF-8)但未序列化期望更长的字符串。

解决方案:

/**
 * serialize utf8 values
 *
 * @param $serial_str
 *   input sting  serialize.
 * 
 * @return (array) $out 
 * serialize values
 * 
 * @author Mudassar Ali <sahil_bwp@yahoo.com>
 */
function mb_unserialize($serial_str) {
    $return = '';
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str);
    $return = unserialize($out);
    if ($return === FALSE) {
        watchdog('unserialize', $out);
    } else {
        return $return;
    }
}

$module->info = mb_unserialize($module->info);

而不是

$module->info = unserialize($module->info);

确保服务器上的默认字符集为UTF8,默认排序规则为utf8_general_ci。这是mysql.ini中的一个设置。这是核选项。

[mysqld]
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8

并确保您的数据库也是

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

答案 2 :(得分:1)

要找出可能导致问题的潜在变量,请找出已损坏的变量,然后将其从数据库中删除。

    SELECT name, LENGTH( value ) , value FROM variable WHERE LENGTH( value ) = "32";

    DELETE FROM variable WHERE name = "broken_variable_name";

答案 3 :(得分:0)

为什么抛出此错误

当Drupal变量表中的条目格式不正确时,会导致此错误。如果您的主机自动安装Drupal安装并且没有正确安装(如我的主机喜欢的那样)或者没有正确创建变量,则通常会发生这种情况。


识别格式错误的变量

我创建了一个模块,但您可以将其写入PHP过滤器输入字段,如节点或块(显然,您需要打开核心模块“PHP过滤器”)。

此代码将输出变量表的内容,因此请勿在生产站点上执行此操作:

  

drupal_set_message(db_query('SELECT name, value FROM {variable}')->fetchAllKeyed() );

然后您可以浏览列表并找到格式错误的列表。


我如何知道哪个变量格式错误

每一行都采用其中一种格式。每个都有2个以冒号分隔的参数。第二个和第三个字段是值,并根据变量名称而变化,只要它们大约是这些格式之一,它们应该没问题:

s:16:"this is a string"

用于String。 16是字符串长的字符数。第三个参数是双引号中的值。

i:10

我是整数人。 10是整数的值。

b:0

b代表booleen。 0是值

a:0:{}

a代表数组。 0是元素的数量,第三个参数是数组。该数组可能包含上述任何数据类型(甚至是另一个数组)。

不属于上述格式之一的变量格式不正确。


修复格式错误的变量

您应该能够隔离问题,如果它是像“site_name”或“site_mail”这样的变量,您可以通过更新设置该变量的配置页来解决此问题(例如,站点信息)。如果格式错误的变量不是您认可的变量:

将一行代码放入模块或PHP过滤器输入中。

  

set_variable( 'the_name_of_the_malformed_variable', 'the_value_you_think_it_should_be');

运行一次,然后删除,您的错误应该修复。

遵循以上风险需要您自担风险。如果您遇到问题,请在下面留言。

答案 4 :(得分:0)

我在(在?期间)drupal的核心更新后收到此错误 Notice: unserialize(): Error at offset 11 of 35 bytes in variable_initialize() (line936 of /var/www/vhosts/3/101684/webspace/siteapps/Drupal-12836/htdocs/includes/bootstrap.inc). 我安装了变量检查模块(http://drupal.org/project/variablecheck),它识别出坏的值:
update_notify_emails a:1:{i:0;s:26:"user@email.com";} 但是这表明函数正在期待一个数组,而不仅仅是一个字符串所以我不能只设置一个新值
set_variable('the_name_of_the_malformed_variable','the_value_you_think_it_should_be'); 当我检查mysql数据库中的值表但数据值是一个blob而我无法编辑它。不知道什么模块设置该值以及如果我简单地删除它可能会破坏什么我决定尝试&#34;重新设置&#34;阵列清除它。

谷歌告诉我&#34; update_notify_emails&#34;在更新模块中调用模块,单击更新管理器的congfigure 并编辑了&#34;电子邮件地址的值,以便在有更新时通知&#34; (我的空白)。由于错误表明它同时期望一个int和一个字符串,我也在'#34;只有安全更新&#34;所以价值也传入了。点击保存,错误就消失了。