array_flip():只能翻转STRING和INTEGER的值! 在DrupalDefaultEntityController-> load()
我最近将模块迁移到了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的值需要是有效的键,即它们需要是整数或string。 如果值的types错误,则会发出警告,并且所涉及的键/值对不会被翻转。
我做了var_dump($ids);
$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)
这个错误的最常见的原因是使用一个数组作为参数的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); ?>
所以,最简单的方法是search“_load(array”)。
我在周末遇到了同样的array_flip错误,试图升级自定义模块到Drupal 7.问题是嵌套数组传递到DrupalDefaultEntityController,但它期望一个简单的整数或string数组。 在我的情况下,我只是传入一个嵌套数组到EntityFieldQuery,当它只需要一个整数数组。
为了更好地追踪调用DrupalDefaultEntityController的代码,请尝试在entity.inc的第178行之前插入以下内容:
drupal_set_message(var_export(debug_backtrace(), TRUE));
…或者最好安装Devel模块,然后尝试插入以下内容:
dpm( debug_backtrace() );
当您使用有机组字段访问(有机组7.x-1.3)时出现问题
您通常可以禁用该子模块,除非您使用OG进行字段级别的访问控制。
当你使用一个不是实体id数组的数组来调用entity_load时,也会发生这种情况 – 请参阅http://api.drupal.org/api/drupal/includes–common.inc/function/entity_load/ 7和http://drupal.org/node/1160566来理解为什么。;
在我们使用最新的page_title模块中看到类似的问题。 现在,我们只是禁用模块,它清理错误。
请参阅: http : //www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/
你在使用插入模块吗? 参见http://drupal.org/node/850946 。
当涉及到这样的具体错误时,我认为你最好在drupal.org上search问题队列,而不是在SO上查询。
好用的例子:
<?php $user=user_load(arg(1)); $username=$user->name; print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username)); ?>
这可能是错误编码的问题(例如,加载无效的实体或在Drupal 7中运行一些旧的Drupal 6代码):
- 如果您有任何自定义模块,请仔细检查您的代码是否存在常见错误
- entity_load()的使用无效,
- 将加载对象的数组传递给entity_load(),
- 检查实体API和示例模块 ,它提供了在Drupal 7中使用实体的正确方法。
- 如果你使用的是contrib模块,find正确的错误并应用补丁(如果有的话)或提出新的补丁。
故障排除:
- 您可以尝试通过调用并打印
print_r(debug_backtrace())
来转储回溯, - 使用你的scm工具回到工作正常的地步,比较这些变化,所以最终你会发现问题出在哪里(比如
gitk
,git log --patch
等等) - 请使用Coder Review模块在更新后查找代码中的错误(例如
drush --contrib --no-empty --upgrade7x coder-review
)。 - 安装XDebug ,通过跟踪日志或逐步debugging来跟踪您的问题。
或者,你可以通过定义下面的临时钩子来debugging你的代码:
/** * 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()); } }
在testing之前清除caching。
它会在每个PHP警告或错误的参数上打印回溯,所以你可以find传入Drupal核心的无效参数。
感谢post,它为我工作!,我在Drupal 7长时间遇到这个问题,并可能克服这个问题。 底线
“不要将数组的值传递给array_flip,例如:如果您正在尝试加载实体user_load()或field_collection_item_load()以加载字段集合项,则只传递string中的值而不是数组本身。
谢谢!!
这是简单的解决scheme:)
编辑settings.php
文件并添加这一行
error_reporting(0);