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

问题描述 投票:2回答:5

我的Drupal网站页面上方显示此错误:

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

此错误是什么意思,我该如何解决?

drupal drupal-6 error-handling
5个回答
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管理员http://yoursite.com/admin/reports/dblog中的“最近的日志条目”,并按类型unserialize进行了过滤。

一旦有了变量名,我将连接到数据库并执行此查询:

SELECT * FROM variable WHERE name='name-goes-here';

并且我把在日志中找到的名称。我查看了该值并弄清楚为什么它会导致此错误,然后修复该值。

希望对您有帮助。


1
投票

我的问题与UTF-8有关。字符串更短-按字符排列(由于包含UTF-8),但未序列化,期望更长。

解决方案:

/**
 * serialize utf8 values
 *
 * @param $serial_str
 *   input sting  serialize.
 * 
 * @return (array) $out 
 * serialize values
 * 
 * @author Mudassar Ali <[email protected]>
 */
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;

0
投票

为什么会引发此错误

此错误是由于Drupal变量表中的条目格式不正确引起的。如果您的主机自动安装了Drupal安装程序却没有正确执行它(例如我的主机喜欢这样做),或者没有正确创建变量,则经常发生这种情况。


识别格式错误的变量

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

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

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

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


我怎么知道哪个变量格式不正确

每一行都是这些格式之一。每个参数都有2个用冒号分隔的参数。第二和第三字段是值,并根据变量名称而有所不同,只要它们是以下格式之一,就应该可以:

s:16:"this is a string"

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

i:10

i是整数。 10是整数的值。

b:0

b是不干胶。 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');

运行一次,然后删除,您的错误应该已解决。

遵循上述规定,后果自负。如果您有问题,请在下面发表评论。


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:"[email protected]";}但这表明函数需要一个数组,而不仅仅是一个字符串,所以我不能只用set_variable('the_name_of_the_malformed_variable','the_value_you_think_it_should_be');当我检查mysql db中的值表但数据值是blob时,我无法对其进行编辑。不知道是哪个模块设置了该值,如果我简单地删除它,可能会破坏什么,所以我决定尝试“重新设置”该数组以清除它。

Google告诉我,在更新模块中将“ update_notify_emails”称为模块,单击Update Manager的配置并编辑了“有可用更新时通知的电子邮件地址”的值(我的为空白)。由于错误指示它同时期望一个int和一个字符串,因此我也翻转了“仅安全更新”上的设置,以便该值也被传入。单击保存,错误消失了。


0
投票

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

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

    DELETE FROM variable WHERE name = "broken_variable_name";
© www.soinside.com 2019 - 2024. All rights reserved.