【问题标题】:Notice: unserialize() [function.unserialize] in Drupal注意:Drupal 中的 unserialize() [function.unserialize]
【发布时间】:2012-03-13 12:57:07
【问题描述】:

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

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

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

【问题讨论】:

标签: drupal drupal-6 error-handling


【解决方案1】:

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

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

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

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

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

如果您将值更改为s:9:"Some other value";,那么这将导致问题。 第一个字符是值的类型。值s 表示字符串。然后冒号后面跟一个数字表示长度。在这种情况下,单词 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';

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

我希望这会有所帮助。

【讨论】:

  • 不一定是通过变量表,Drupal 序列化了很多东西
  • @Clive:没错,但是他给出的行号和文件名非常接近$variables[$variable->name] = unserialize($variable->value);
  • @roychris 糟糕,我懒得看! +1 为您提供非常深入的答案
【解决方案2】:

我的问题与 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;

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      为什么会抛出这个错误

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


      识别格式错误的变量

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

      此代码将输出变量表的内容,所以不要在生产站点上这样做:

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

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


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

      每一行都是这些格式之一。每个都有 2 个由冒号分隔的参数。第 2 和第 3 个字段是值,并根据变量名称而有所不同,只要它们是这些格式中的一种,它们应该没问题:

      s:16:"this is a string"

      s 用于字符串。 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');

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

      请自行承担上述风险。如果您有问题,请在下方留言。

      【讨论】:

        【解决方案5】:

        我在(期间?)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 并且我无法编辑它时。不知道是哪个模块设置了该值以及如果我简单地删除它可能会破坏什么,我决定尝试“重新设置”数组以将其清除。

        谷歌告诉我“update_notify_emails”在更新模块中被调用成模块,点击配置更新管理器 并编辑了“电子邮件地址以在更新可用时通知”的值(我的是空白)。由于错误表明它需要一个 int 和一个字符串,我还翻转了“仅安全更新”上的设置,以便也传入该值。点击保存,错误消失。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-28
          • 2013-02-22
          • 1970-01-01
          • 1970-01-01
          • 2017-09-14
          • 1970-01-01
          • 2018-11-06
          • 1970-01-01
          相关资源
          最近更新 更多