Drupal如何修复通知unserialize()和Undefined index?

时间:2018-04-08 06:32:31

标签: drupal drupal-7

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

  1. 注意:unserialize():field_read_fields()中偏移量为0的728字节错误(/my_website/modules/field/field.crud.inc的第374行)。
  2. 注意:未定义的索引:text_field_schema()中的设置(/my_website/modules/field/modules/text/text.install的第17行)。
  3. 如何解决通知?

1 个答案:

答案 0 :(得分:1)

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

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

第二个通知告诉我们通过text_field_schema()调用的被控制字段hook_field_schema的类型,公开了三种字段类型:texttext_long,{{1 }}。

text_with_summary

就在第388行上方,你得到了这个:

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

通过实现此钩子,您应该能够指出哪条记录被破坏了:

module_invoke_all('field_read_field', $field);

一旦确定,您可能需要修复"通过FieldAPI保存之前的字段结构,例如:

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

结构应如field_create_field()中所定义。

[编辑]

如果您不能使用字段API,那么您应该能够看到该字段的哪条记录被破坏了。

致电$field += array( 'settings' => array( 'max_length' => $somelength ) ); field_update_field($field); 并调试:

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']); // ... } ),并将其与其他记录进行比较,看看有什么不对。最后,如果您不能使用字段API,则可能必须使用SQL语句更新字段。