array_flip (): может переворачивать только значения STRING и INTEGER!в DrupalDefaultEntityController-> load () - PullRequest
38 голосов
/ 25 января 2011

Я недавно перенес свой модуль на 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-янв-24), просмотры 7.x-3.x-dev (2011-янв-22), Drupal core 7.x-dev (2011-Jan-24), profile2 7.x-1.0-beta1, ссылки 7.x-2.x-dev (2011-янв-14), ctools 7.x-1.0-alpha2

Я не могу понять, что именно вызывает эту ошибку?

Edit:

Согласно http://php.net/manual/en/function.array-flip.php,

array_flip () возвращает массив в обратном порядке, то есть ключи от trans становятся значениями, а значения из trans становятся ключами.

Обратите внимание, что значения trans должны быть действительными ключами, то есть они должны быть либо целыми числами, либо строками. Предупреждение будет издано, если значение имеет неправильный тип, и рассматриваемая пара ключ / значение не будет быть перевернутым.

Я сделал var_dump($ids); перед строкой 178 в entity.inc ($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)

Ответы [ 11 ]

86 голосов
/ 26 января 2011

Самая распространенная причина этой ошибки - использование функции some_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".

10 голосов
/ 26 января 2011

В выходные я столкнулся с той же ошибкой array_flip, пытаясь обновить пользовательский модуль до Drupal 7. Проблема в том, что вложенный массив передается в DrupalDefaultEntityController, но он ожидает простой массив целых чисел или строк. В моем случае я передавал вложенный массив в EntityFieldQuery, когда ему нужен только массив целых чисел.

Чтобы лучше отследить код, вызывающий DrupalDefaultEntityController, попробуйте вставить следующую строку перед строкой 178 в entity.inc:

.
drupal_set_message(var_export(debug_backtrace(), TRUE));

... или, желательно, установите модуль Devel и попробуйте вместо него ввести следующее:

dpm( debug_backtrace() );
6 голосов
/ 22 февраля 2012

Проблема возникает, когда вы используете полевой доступ к органическим группам (Organic Groups 7.x-1.3)

Обычно вы можете отключить этот субмодуль, если не используете управление доступом на уровне поля с OG.

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

3 голосов
/ 28 июня 2011

Это также может произойти, когда вы вызываете entity_load с массивом, который не является массивом идентификаторов сущности в качестве второго аргумента - см. http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7 и http://drupal.org/node/1160566, чтобы понять, почему.

1 голос
/ 26 апреля 2011

Видел аналогичную проблему в нашем использовании последнего модуля page_title.Пока мы просто отключили модуль, и он устранил ошибку.

См .: http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/

0 голосов
/ 22 августа 2018

Я также получил это сообщение, когда ошибочно пытался загрузить несколько узлов через node_load_multiple ($ nids), где $ nids не был массивом идентификаторов узлов.

Например, используя результат EntityFieldQueryи вызов node_load_multiple ($ result ['node']) вместо node_load_multiple (array_keys ($ result ['node'])).

0 голосов
/ 22 ноября 2012

Это может быть проблемой плохого кодирования (например, загрузка недействительных сущностей или запуск старого кода Drupal 6 в Drupal 7):

  • Если у вас есть какие-либо пользовательские модули, дважды проверьте код на наличие распространенных ошибок
    • Неправильное использование entity_load () ,
    • Передача массива загруженных объектов в entity_load (),
    • Проверка API сущностей и Пример модуля , который обеспечивает правильный способ использования сущностей в 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.

0 голосов
/ 15 ноября 2012

Пример хорошего использования:

<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>
0 голосов
/ 28 июля 2012

Спасибо за пост, который у меня сработал !, я давно сталкивался с этой проблемой в Drupal 7 и мог решить эту проблему.Нижняя строка

"Не передавайте значения массива в array_flip для каких-либо сущностей, например: если вы пытаетесь загрузить сущность user_load () или field_collection_item_load () для загрузки элементов коллекции полей, передавайте только значения вСтрока, а не сам массив. "

Спасибо !!

0 голосов
/ 19 июня 2011

Вот простое решение:)

Отредактируйте settings.php файл и добавьте эту строку

error_reporting(0);
...