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)
Ответы
Ответ 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
Ответ 4
Это также может произойти, когда вы вызываете entity_load с массивом, который не является массивом идентификатора объекта как вторым аргументом - см. http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7 и http://drupal.org/node/1160566, чтобы понять, почему.
Ответ 5
Увидел аналогичную проблему в нашем использовании последнего модуля page_title. На данный момент мы просто отключили модуль, и он очистил ошибку.
Смотрите: http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/
Ответ 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);