Drupal Как исправить уведомление об unserialize() и Undefined index?

avatar
Mahtab Alam
8 апреля 2018 в 06:32
518
1
0

Я получаю уведомление об упоминании ниже на странице /admin/reports/status.

  1. Примечание: unserialize(): ошибка по смещению 0 из 728 байтов в field_read_fields() (строка 374 файла /my_website/modules/field/field.crud.inc).
  2. Примечание: Неопределенный индекс: настройки в text_field_schema() (строка 17 файла /my_website/modules/field/modules/text/text.install).

Как исправить уведомление?

Источник

Ответы (1)

avatar
EricLavault
8 апреля 2018 в 11:10
1

Функция unserialize() не может преобразовать сериализованное значение обратно в значение PHP из-за недопустимой длины (или несоответствия длины) в сохраненном представлении данных.

Это означает, что запись поля была неправильно сохранена в таблице полей.

Второе уведомление сообщает нам тип инкриминируемого поля: text_field_schema(), вызываемое через hook_field_schema, предоставляет три типа полей: text, text_long, text_with_summary.

// line 392 of modules/field/field.crud.inc
$schema = (array) module_invoke($field['module'], 'field_schema', $field);

Чуть выше, строка 388, вы получили это:

module_invoke_all('field_read_field', $field);

Применяя этот хук, вы сможете указать, какая запись сломана:

function yourmodule_field_read_field($field) {
  if ($field['module'] === 'text' && !isset($field['settings'])) {
    dpm($field);
  }
}

После идентификации вам, вероятно, придется «исправить» структуру поля, прежде чем сохранять ее, как обычно, через FieldAPI, например. :

$field += array(
  'settings' => array(
    'max_length' => $somelength
  )
);
field_update_field($field);

Структура должна быть такой, как определено в field_create_field().


[РЕДАКТИРОВАТЬ]

Если вы не можете использовать API поля, вы все равно сможете увидеть, какая запись не работает для этого поля.

Вызов field_read_field($field_name) и отладка:

// line 370 of modules/field/field.crud.inc
$fields = array();
$results = $query->execute();
foreach ($results as $record) {
  dpm($record); // check $record['data']
  $field = unserialize($record['data']); 
  // ...
}

Неработающая запись должна быть напечатана непосредственно перед первым уведомлением (если вы его отображаете).

Проверьте сериализованное значение ($record['data']) и сравните его с другими записями, чтобы увидеть, что не так. В конце концов вам, возможно, придется обновить поле с помощью операторов SQL, если вы не можете использовать API поля.

Mahtab Alam
8 апреля 2018 в 11:26
0

реализована функция yourmodule_field_read_field($field) { if ($field['module'] === 'text' && !isset($field['settings'])) { dpm($field); } } но ничего не показывает.

Mahtab Alam
8 апреля 2018 в 11:27
0

Я также заменяю yourmodule своим именем пользовательского модуля.

EricLavault
8 апреля 2018 в 11:40
0

Вы должны увидеть вывод dpm() при переходе в /admin/reports/status. Или я что-то упускаю... Может, изменить условие. Я перепроверю позже, я вернусь через 2 часа

Mahtab Alam
8 апреля 2018 в 11:42
0

это показывает, когда после очистки кеша. Я получаю поле, для которого это идет. "поле_почему"

Mahtab Alam
8 апреля 2018 в 13:54
0

Это поле находится внутри field_collection. Поэтому при вызове field_update_field($field); сайт останавливается и показывает тайм-аут.

EricLavault
8 апреля 2018 в 14:46
0

Хорошо, поле идентифицировано, так что теперь вы сможете увидеть, какая запись для этого поля нарушена, проверить сериализованное значение ($record['data']) и сравнить его с другими записями, чтобы увидеть, что не так. В конце концов вам, возможно, придется обновить поле с помощью операторов SQL, если вы не можете использовать API поля.

Mahtab Alam
8 апреля 2018 в 19:13
0

Да, я проверяю значение $record['data'] для этого поля. Данные сериализации неверны. Я обновил данные на новый, и он работает. Спасибо @Эрик

Mahtab Alam
8 апреля 2018 в 19:15
0

Можете ли вы объяснить, почему данные ломаются?

EricLavault
8 апреля 2018 в 19:43
0

@Mahtab Это может быть связано с тем, что кто-то отредактировал сохраненное представление данных в базе данных, или, может быть, само поле data не имеет подходящего типа для хранения ваших значений в базе данных. PHP говорит, что serialize() возвращает строку, которая может содержать нулевые байты, и ее необходимо хранить и обрабатывать как таковую. Например, выходные данные сериализации обычно должны храниться в поле BLOB в базе данных, а не в поле CHAR или TEXT. Вы можете проверить это.