Обратите внимание: unserialize () [function.unserialize] в Drupal - PullRequest
2 голосов
/ 13 марта 2012

Я вижу эту ошибку над страницами моего сайта на Drupal:

Примечание: unserialize () [function.unserialize]: ошибка по смещению 0 из 32 байты в C: \ xampp \ htdocs \ irbid \ includes \ bootstrap.inc в строке 559

Что означает эта ошибка и как ее исправить?

Ответы [ 4 ]

3 голосов
/ 13 марта 2012

Это вызвано поврежденной записью в таблице переменных. Значение этой таблицы является сериализованным значением 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 и отфильтровал по типу unserialize.

Получив имя переменной, я подключался к базе данных и выполнял этот запрос:

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

и я поставил имя, которое нашел в журналах. Я смотрю на значение и выясняю, почему оно вызывает эту ошибку, а затем исправляю значение.

Надеюсь, это поможет.

1 голос
/ 02 января 2014

Моя проблема была связана с 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;
0 голосов
/ 21 января 2015

Я получил эту ошибку после (во время?) Обновления ядра 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, но значение данных было большим, и я не смог его отредактировать. Не зная, какой модуль установил это значение и что могло бы сломаться, если бы я просто удалил его, я решил попробовать «переустановить» массив, чтобы очистить его.

Google сказал мне, что "update_notify_emails" вызывается в модуле обновления на модули, щелкнул congfigure для Update Manager и отредактировал значение для «Адреса электронной почты, чтобы уведомлять, когда обновления доступны» (мой был пустым). Так как ошибка указала, что она ожидала и int, и строку, я также переключил параметр «Только обновления безопасности», чтобы это значение также передавалось. Нажал сохранить и ошибка ушла.

0 голосов
/ 15 мая 2014

Почему выдается эта ошибка

Эта ошибка возникает, когда запись в таблицах переменных 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 isдля строки.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');

Запустите его один раз, а затем удалите, ваша ошибка должна быть исправлена.

Следуйте вышеизложенному на свой страх и риск.Если у вас есть проблемы, оставьте комментарий ниже.

...