array_flip():只能翻转 STRING 和 INTEGER 值!在 DrupalDefaultEntityController->load()
Posted
技术标签:
【中文标题】array_flip():只能翻转 STRING 和 INTEGER 值!在 DrupalDefaultEntityController->load()【英文标题】:array_flip():Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() 【发布时间】:2011-06-15 10:40:48 【问题描述】:我最近将我的模块迁移到 Drupal7(在 php 版本 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
实体 7.x-1.x-dev (2011-Jan-24), 查看 7.x-3.x-dev (2011-Jan-22), Drupal 核心 7.x-dev (2011-Jan-24), profile2 7.x-1.0-beta1, 参考 7.x-2.x-dev (2011-Jan-14), ctools 7.x-1.0-alpha2
我无法弄清楚究竟是什么导致了这个错误?
编辑:
根据http://php.net/manual/en/function.array-flip.php,
array_flip() 以翻转顺序返回一个数组,即来自 trans 的键 从 trans 变成值,从 trans 变成键。
注意 trans 的值必须是有效的键,即它们必须是整数或字符串。如果出现警告将发出 值的类型错误,并且有问题的键/值对不会 被翻转。
我在 entity.inc ($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;
) 的第 178 行之前完成了var_dump($ids);
在我看来,键/值对总是格式正确(?)。
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)
【问题讨论】:
您是否将您的模块或站点迁移到了 drupal 7?如果是自定义模块,代码在哪里?此外,您应该尝试关闭模块,直到警告消失以进一步缩小范围。有些东西给出了错误的参数。 是的,我已将我的模块迁移到 Drupal 7。但错误出现在 entity.inc 文件中,该文件是 Drupal 7 的核心文件。 关于上面的 var_dump 输出:不,键/值对中的 not 格式正确。 array_flip 函数可以翻转像array(0 => 'a')
这样的数组,但不能翻转array(0 => array(0 => 'a'))
,因为嵌套数组必须成为数组键。
【参考方案1】:
当 Drupal 出现此类错误时,我的建议是首先检查管理面板中的“最近的日志消息”列表:
这个页面对我很有帮助很多次。
提示:有时不仅要查看最后的错误,还要查看警告和通知 紧接在它之前的消息。其中之一的详细信息通常包含解决问题的重要提示。
【讨论】:
【参考方案2】:当我错误地尝试通过 node_load_multiple($nids) 加载多个节点时,我也收到此消息,其中 $nids 不是节点 ID 数组。
例如,使用 EntityFieldQuery 的结果,并调用 node_load_multiple($result['node']) 而不是 node_load_multiple(array_keys($result['node']))。
【讨论】:
【参考方案3】:这是一个简单的解决方案:)
编辑settings.php
文件并添加这一行
error_reporting(0);
【讨论】:
1) 不要破解核心。 2)不要这样做。仅在开发完成后关闭生产站点上的错误报告,并以正确的方式进行 - 通过 Drupal 的 UI。 Adam 所说的,或者编写您自己的模块以在代码中执行此操作,并且仅在生产中启用该模块。【参考方案4】:这可能是错误编码的问题(例如加载无效实体或在 Drupal 7 中运行一些旧的 Drupal 6 代码):
如果您有任何自定义模块,请仔细检查您的代码是否存在常见错误 entity_load() 的使用无效, 将加载对象的数组传递给 entity_load(), 检查 Entity API 和 Example module,它们提供了在 Drupal 7 中使用实体的正确方法。 如果您使用的是 contrib 模块,请找到针对它的正确错误并应用补丁(如果可用)或提出新补丁。疑难解答:
您可以尝试通过调用和打印print_r(debug_backtrace())
来转储回溯,
使用您的 scm 工具返回到它工作正常的点,并比较更改,最终您会发现问题出在哪里(例如gitk
、git log --patch
等)
请在更新后使用Coder Review 模块查找代码中的错误(例如drush --contrib --no-empty --upgrade7x coder-review
)。
安装XDebug 以通过跟踪日志或逐步调试来跟踪您的问题。
或者,您可以通过定义以下临时挂钩来调试您的代码:
/**
* 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 核心的无效参数。
【讨论】:
【参考方案5】:好用的例子:
<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>
【讨论】:
【参考方案6】:感谢它为我工作的帖子!我在 Drupal 7 中遇到这个问题很长时间了,并且可以解决这个问题。底线
"不要将数组值传递给任何类型的实体的array_flip, 例如:如果您尝试加载实体 user_load() 或 field_collection_item_load() 来加载字段集合项,则仅传递字符串中的值而不是数组本身。”
谢谢!!
【讨论】:
【参考方案7】:当您使用有机组字段访问时会出现问题(有机组 7.x-1.3)
您通常可以禁用该子模块,除非您使用 OG 进行字段级访问控制。
http://drupal.org/node/1102570#comment-5626946
【讨论】:
这是我的问题 - 我设法追踪了发送的内容,它有很多由 array(0 => NULL) 组成的数组【参考方案8】:当您使用不是实体 ID 数组的数组作为第二个参数调用 entity_load 时,也会发生这种情况 - 请参阅 http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7 和 http://drupal.org/node/1160566 以了解原因。
【讨论】:
【参考方案9】:在我们使用最新的 page_title 模块时发现了类似的问题。目前,我们只是禁用了该模块并清除了错误。
见:http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/
【讨论】:
【参考方案10】:此错误的最常见原因是使用带有数组作为参数的 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”。
【讨论】:
非常感谢。这就是问题所在。我在做 $node = node_load(array('nid' => $node->nid));和 $thisUser = user_load(array('uid' => $service->uid)) 在许多地方。还要感谢使用“_load(array”) 进行快速搜索的提示。太棒了! 谢谢。即使在核心:form.inc,触发器模块中,我也发现了这种用法的例子。此外,社区模块“pathauto”和“page_title”仍然使用旧语法。 或者如果您尝试将 null/false 值传递给加载函数,例如:$nid=null; node_load($null); 只是补充一下,entity_load()
要求 ID 是一个数组,即entity_load('field_collection_item', array(123));
【参考方案11】:
我在周末遇到了同样的 array_flip 错误,试图将自定义模块升级到 Drupal 7。问题是嵌套数组被传递到 DrupalDefaultEntityController,但它需要一个简单的整数或字符串数组。在我的例子中,当它只需要一个整数数组时,我将一个嵌套数组传递给 EntityFieldQuery。
为了更好地追踪调用 DrupalDefaultEntityController 的代码,请尝试在 entity.inc 的第 178 行之前插入以下代码:
drupal_set_message(var_export(debug_backtrace(), TRUE));
... 或者最好安装 Devel 模块并尝试插入以下内容:
dpm( debug_backtrace() );
【讨论】:
【参考方案12】:您在使用插入模块吗?见http://drupal.org/node/850946。
当涉及到这样的特定错误时,我认为您最好在drupal.org 搜索问题队列而不是在 SO 上询问。
【讨论】:
也许你是对的。我需要更好地查看 Drupal.org 上的问题队列。我只是希望如果我能得到一些关于 array_flip() 以及如何不使用它的建议。 没有。我没有使用插入模块。只是我上面提到的模块。以上是关于array_flip():只能翻转 STRING 和 INTEGER 值!在 DrupalDefaultEntityController->load()的主要内容,如果未能解决你的问题,请参考以下文章