Функция 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 поля.
реализована функция yourmodule_field_read_field($field) { if ($field['module'] === 'text' && !isset($field['settings'])) { dpm($field); } } но ничего не показывает.
Я также заменяю yourmodule своим именем пользовательского модуля.
Вы должны увидеть вывод dpm() при переходе в /admin/reports/status. Или я что-то упускаю... Может, изменить условие. Я перепроверю позже, я вернусь через 2 часа
это показывает, когда после очистки кеша. Я получаю поле, для которого это идет. "поле_почему"
Это поле находится внутри field_collection. Поэтому при вызове field_update_field($field); сайт останавливается и показывает тайм-аут.
Хорошо, поле идентифицировано, так что теперь вы сможете увидеть, какая запись для этого поля нарушена, проверить сериализованное значение (
$record['data']
) и сравнить его с другими записями, чтобы увидеть, что не так. В конце концов вам, возможно, придется обновить поле с помощью операторов SQL, если вы не можете использовать API поля.Да, я проверяю значение $record['data'] для этого поля. Данные сериализации неверны. Я обновил данные на новый, и он работает. Спасибо @Эрик
Можете ли вы объяснить, почему данные ломаются?
@Mahtab Это может быть связано с тем, что кто-то отредактировал сохраненное представление данных в базе данных, или, может быть, само поле
data
не имеет подходящего типа для хранения ваших значений в базе данных. PHP говорит, чтоserialize()
возвращает строку, которая может содержать нулевые байты, и ее необходимо хранить и обрабатывать как таковую. Например, выходные данные сериализации обычно должны храниться в поле BLOB в базе данных, а не в поле CHAR или TEXT. Вы можете проверить это.