我最近将我的模块迁移到了Drupal7(在PHP Version 5.3.1上),现在我遇到了以下错误:
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
* Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
我还尝试将其他模块和核心升级到最新版本http://drupal.org/node/1022736
entity 7.x-1.x-dev(2011年1月24日), 观点7.x-3.x-dev(2011年1月22日), Drupal核心7.x-dev(2011年1月24日), profile2 7.x-1.0-beta1, 参考文献7.x-2.x-dev(2011年1月14日), ctools 7.x-1.0-alpha2
我无法弄清楚究竟是什么导致了这个错误?
修改
根据http://php.net/manual/en/function.array-flip.php,
array_flip()以翻转顺序返回一个数组,即来自trans的键 从变成价值和价值成为关键。
请注意,trans的值必须是有效键,即它们必须是整数或字符串。如果a,将发出警告 值的类型错误,并且有问题的键/值对不会 被翻转。
我在entity.inc(var_dump($ids);
)第178行之前完成了$passed_ids = !empty($ids) ? array_flip($ids) : FALSE;
在我看来,键/值对的格式总是正确的(?)。
array
0 =>
array
'nid' => string '6' (length=1)
array
0 =>
array
'uid' => string '1' (length=1)
array
0 => string '0' (length=1)
array
0 =>
array
'nid' => string '7' (length=1)
array
0 =>
array
'nid' => string '4' (length=1)
array
0 =>
array
'nid' => string '8' (length=1)
答案 0 :(得分:86)
此错误的最常见原因是使用带有数组作为参数的something_load()函数。这不再受支持,因为现在需要使用load_multiple()函数。
D6中的示例:
<?php
// Using array with the id was already discouraged in D6 but still worked.
$user = user_load(array('uid' => 1));
$user = user_load(array('name' => 'admin'));
?>
Drupal 7:
<?php
// Argument to a load() function *must* be a single id
$user = user_load(1);
// Querying for another attribute is a bit more complex.
// Note that using reset(user_load_multiple() directly is not E_STRICT compatible.
$users = user_load_multiple(array(), array('name' => 'admin'));
$user = reset($users);
?>
因此,捕获这些内容的最简单方法是搜索“_load(array”。
答案 1 :(得分:10)
我在周末遇到了同样的array_flip错误,试图将自定义模块升级到Drupal 7.问题是嵌套数组被传递到DrupalDefaultEntityController,但它期望一个简单的整数或字符串数组。在我的例子中,当它只需要一个整数数组时,我将一个嵌套数组传递给EntityFieldQuery。
为了更好地跟踪调用DrupalDefaultEntityController的代码,请尝试在entity.inc中的第178行之前插入以下内容:
drupal_set_message(var_export(debug_backtrace(), TRUE));
...或者最好安装Devel模块并尝试插入以下内容:
dpm( debug_backtrace() );
答案 2 :(得分:6)
当您使用有机组字段访问(有机组7.x-1.3)
时,会出现此问题除非您使用OG进行字段级访问控制,否则通常可以禁用该子模块。
答案 3 :(得分:3)
当您使用不是实体ID数组的数组作为第二个参数调用entity_load时,也会发生这种情况 - 请参阅http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7和http://drupal.org/node/1160566以了解原因。
答案 4 :(得分:1)
在我们使用最新的page_title模块时遇到了类似的问题。目前,我们只是禁用了模块,它清理了错误。
请参阅:http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/
答案 5 :(得分:0)
您使用的是插入模块吗?请参阅http://drupal.org/node/850946。
当涉及到这样的特定错误时,我认为您最好在drupal.org搜索问题队列而不是询问SO。
答案 6 :(得分:0)
良好使用的例子:
<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>
答案 7 :(得分:0)
这可能是编码错误的问题(例如,在Drupal 7中加载无效实体或运行一些旧的Drupal 6代码):
故障排除:
print_r(debug_backtrace())
,gitk
,git log --patch
等。 )drush --contrib --no-empty --upgrade7x coder-review
)。或者,您可以通过定义以下临时挂钩来调试代码:
/**
* Implements hook_watchdog().
*/
function foo_watchdog($log_entry) {
if ($log_entry['type'] == 'php' && $log_entry['severity'] <= WATCHDOG_WARNING) {
// Old school
var_dump(debug_backtrace()); // Optionally add: exit();
// Devel: Log the backtrace into temporary file: drupal_debug.txt
// Locate via: $ drush eval "echo file_directory_temp() . '/drupal_debug.txt'"
function_exists('dd') && dd(debug_backtrace());
}
}
在测试之前清除缓存。
它会在每个PHP警告或带参数的错误上打印回溯,因此您可以找到传递给Drupal核心的无效参数。
答案 8 :(得分:0)
当我错误地尝试通过node_load_multiple($ nids)加载多个节点时,也收到了此消息,其中$ nids不是节点ID的数组。
例如,使用EntityFieldQuery的结果,并调用node_load_multiple($ result ['node'])而不是ʻnode_load_multiple(array_keys($ result ['node']))。
答案 9 :(得分:0)
当Drupal出现此类错误时,我的建议是首先检查“管理”面板中的“最近的日志消息”列表:
此页面对我很有帮助。
提示:有时候,不仅要查看最后一个错误,还要查看警告和通知 >紧接其前的消息。其中的详细信息通常包含解决问题的重要提示。
答案 10 :(得分:-1)
感谢你为我工作的帖子!我在Drupal 7遇到这个问题很长时间以来可以解决这个问题。底线
“不要为任何类型的实体传递数组值到array_flip, 例如:如果您正在尝试加载并使用实体user_load()或field_collection_item_load()来加载字段集合项,请仅传递字符串中的值而不是数组本身。“
谢谢!
答案 11 :(得分:-4)
这是一个简单的解决方案:)
修改settings.php
文件并添加此行
error_reporting(0);