array_flip():只能翻转STRING和INTEGER值!在DrupalDefaultEntityController-> load()中

时间:2011-01-25 19:40:28

标签: arrays drupal drupal-modules php

我最近将我的模块迁移到了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)

12 个答案:

答案 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进行字段级访问控制,否则通常可以禁用该子模块。

http://drupal.org/node/1102570#comment-5626946

答案 3 :(得分:3)

当您使用不是实体ID数组的数组作为第二个参数调用entity_load时,也会发生这种情况 - 请参阅http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7http://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代码):

  • 如果您有任何自定义模块,请仔细检查您的代码是否存在常见错误
  • 如果您正在使用contrib模块,请找到针对它的错误并应用补丁(如果可用)或提升新补丁。

故障排除:

  • 您可以尝试通过调用和打印print_r(debug_backtrace())
  • 来转储回溯
  • 使用您的scm工具返回到工作正常的位置,并比较更改,最终您将找到问题所在(例如gitkgit 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核心的无效参数。

答案 8 :(得分:0)

当我错误地尝试通过node_load_multiple($ nids)加载多个节点时,也收到了此消息,其中$ nids不是节点ID的数组。

例如,使用EntityFieldQuery的结果,并调用node_load_multiple($ result ['node'])而不是ʻnode_load_multiple(array_keys($ result ['node']))。

答案 9 :(得分:0)

当Drupal出现此类错误时,我的建议是首先检查“管理”面板中的“最近的日志消息”列表

enter image description here

此页面对我很有帮助。

提示:有时候,不仅要查看最后一个错误,还要查看警告通知 >紧接其前的消息。其中的详细信息通常包含解决问题的重要提示。

答案 10 :(得分:-1)

感谢你为我工作的帖子!我在Drupal 7遇到这个问题很长时间以来可以解决这个问题。底线

“不要为任何类型的实体传递数组值到array_flip, 例如:如果您正在尝试加载并使用实体user_load()或field_collection_item_load()来加载字段集合项,请仅传递字符串中的值而不是数组本身。“

谢谢!

答案 11 :(得分:-4)

这是一个简单的解决方案:)

修改settings.php文件并添加此行

error_reporting(0);