Уведомление Drupal: unserialize(): ошибка по смещению 104 из 110 байт в _menu_link_translate() (строка 882 mysite\includes\menu.inc)

Привет, я использую drupal 7, у меня возникает эта странная проблема

Notice: unserialize(): Error at offset 104 of 110 bytes in _menu_link_translate() (line 882 of path_to_mysite\includes\menu.inc).

Следующая функция показывает номер строки 882

function _menu_link_translate(&$item, $translate = FALSE) {
  if (!is_array($item['options'])) {
    $item['options'] = unserialize($item['options']);//**this is line number 882**
  }
  if ($item['external']) {
    $item['access'] = 1;
    $map = array();
    $item['href'] = $item['link_path'];
    $item['title'] = $item['link_title'];
    $item['localized_options'] = $item['options'];
  }

Я уже установил Модуль проверки переменных, и он не содержит ошибок. Я также пробовал следующий запрос, но он пуст, пожалуйста, направьте меня сюда.

SELECT name, LENGTH( value ) , value

FROM variable

WHERE LENGTH( value ) = 882

person noobie-php    schedule 30.04.2016    source источник
comment
Попробуйте отладить эту ошибку, используя модуль разработки. То есть установите его и добавьте dpm($item); непосредственно перед строкой #882. Он покажет дамп $item в области сообщений. По крайней мере, вы сможете понять, какой именно пункт меню выдает эту ошибку.   -  person Stanislav Agapov    schedule 30.04.2016


Ответы (1)


Это означает, что рассматриваемая ссылка повреждена. Какая-то функция, процесс или произвольный запрос изменили ссылку в базе данных, так что длина сериализованных данных не соответствует ожидаемой.

Когда вы сериализуете данные, вы обычно сохраняете массив или объект в одном единственном поле. Это может выглядеть примерно так:

a:1:{s:10:"attributes";a:1:{s:5:"title";s:33:"Select and configure your themes.";}}

Что это означает:

- Array with 1 element, which contains:
-- A string that is 10 characters long (attributes) (this is the element key)
-- An array with 1 element (this is the first Array's value), which contains:
--- A string that is 5 characters long (title) (this is the second Array's element key)
--- A string that is 33 characters long (Select and configure your themes.) (This is the second Array's element value)

В этом примере, если вы зашли прямо в свою базу данных и вручную изменили слово «атрибуты» на «лама», но вы НЕ изменили «s: 10» непосредственно перед ним на «s: 5», вы получите ошибка десериализации, аналогичная той, которую вы получаете.

Чтобы решить эту проблему, вам нужно сначала отследить, какая именно ссылка вызывает проблему. Вы можете сделать это с помощью dpm() (как упоминает Станислав выше). Вы также можете напрямую запросить таблицу menu_links и просмотреть в столбце параметров любые ссылки, которые имеют несоответствие между длиной строки и числом, описывающим длину строки. Вы также можете просто начать удалять подозрительные ссылки и добавлять их снова (хотя это может быть нецелесообразно на рабочем или большом сайте).

Есть более сложные методы обнаружения плохих ссылок, но, по моему опыту, это лучшие методы (именно в таком порядке).

Удачи!

person mausolos    schedule 04.05.2016