Drupal 如何修复通知 unserialize() 和未定义的索引?

Drupal How to fix notice unserialize() and Undefined index?

我在 /admin/reports/status 页面上收到以下提及通知。

  1. 注意:unserialize(): field_read_fields() 中 728 字节的偏移量 0 处出错(/my_website/modules/field/field.crud.inc 的第 374 行)。
  2. 注意:未定义的索引:text_field_schema() 中的设置(/my_website/modules/field/modules/text/text.install 的第 17 行)。

如何修复通知?

函数 unserialize() 无法将序列化值转换回 PHP 值,因为存储的数据表示形式中的长度无效(或长度不匹配)。

这意味着字段记录未正确存储在其字段中 table。

第二个通知告诉我们受控字段的类型:text_field_schema(),通过 hook_field_schema 调用,公开了三种字段类型:texttext_longtext_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);
  }
}

一旦确定,您可能必须 "repair" 字段结构,然后才能像往常一样通过字段 API 保存它,例如:

$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']),并将其与其他记录进行比较,看看有什么问题。最后,如果您不能使用字段 API,您可能不得不使用 SQL 语句更新字段。