Подтвердить что ты не робот

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-янв-24), просмотров 7.x-3.x-dev (2011-янв-22), Drupal core 7.x-dev (2011-янв-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)
4b9b3361

Ответ 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);
?>

Итак, самый простой способ поймать их - поиск "_load (array).

Ответ 2

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

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

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

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

dpm( debug_backtrace() );

Ответ 3

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

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

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

Ответ 6

Используете ли вы модуль Insert? См. http://drupal.org/node/850946.

Когда дело доходит до конкретных ошибок, подобных этому, я думаю, что вам лучше искать очередь на вопрос drupal.org, чем спрашивать о SO.

Ответ 7

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

<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>

Ответ 8

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

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

Ответ 9

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

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

Спасибо!!

Ответ 10

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

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

error_reporting(0);