Drupal 如何修复通知 unserialize() 和未定义的索引?
Drupal How to fix notice unserialize() and Undefined index?
我在 /admin/reports/status 页面上收到以下提及通知。
- 注意:unserialize(): field_read_fields() 中 728 字节的偏移量 0 处出错(/my_website/modules/field/field.crud.inc 的第 374 行)。
- 注意:未定义的索引:text_field_schema() 中的设置(/my_website/modules/field/modules/text/text.install 的第 17 行)。
如何修复通知?
函数 unserialize() 无法将序列化值转换回 PHP 值,因为存储的数据表示形式中的长度无效(或长度不匹配)。
这意味着字段记录未正确存储在其字段中 table。
第二个通知告诉我们受控字段的类型: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);
}
}
一旦确定,您可能必须 "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 语句更新字段。
我在 /admin/reports/status 页面上收到以下提及通知。
- 注意:unserialize(): field_read_fields() 中 728 字节的偏移量 0 处出错(/my_website/modules/field/field.crud.inc 的第 374 行)。
- 注意:未定义的索引:text_field_schema() 中的设置(/my_website/modules/field/modules/text/text.install 的第 17 行)。
如何修复通知?
函数 unserialize() 无法将序列化值转换回 PHP 值,因为存储的数据表示形式中的长度无效(或长度不匹配)。
这意味着字段记录未正确存储在其字段中 table。
第二个通知告诉我们受控字段的类型: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);
}
}
一旦确定,您可能必须 "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 语句更新字段。