web-dev-qa-db-fra.com

array_flip (): Ne peut inverser que les valeurs STRING et INTEGER! dans DrupalDefaultEntityController-> load ()

J'ai récemment migré mon module vers Drupal7 (sur la version PHP 5.3.1) et maintenant je reçois les erreurs suivantes:

    * 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).

J'ai également essayé de mettre à niveau d'autres modules et noyau vers les dernières versions mentionnées ici http://drupal.org/node/1022736

entité 7.x-1.x-dev (2011-jan-24), vues 7.x-3.x-dev (2011-jan-22), Drupal core 7.x-dev ( 24 janvier 2011), Profil2 7.x-1.0-beta1, Références 7.x-2.x-dev (2011-janv.-14), Outils ..x-1.0- alpha2

Je ne suis pas capable de comprendre ce qui cause exactement cette erreur?

Modifier:

Selon http://php.net/manual/en/function.array-flip.php

array_flip () retourne un tableau dans l'ordre inverse, c'est-à-dire les clés de trans deviennent des valeurs et les valeurs de trans deviennent des clés.

Notez que les valeurs de trans doivent être des clés valides, c’est-à-dire des nombres entiers ou des chaînes. Un avertissement sera émis si un La valeur de la valeur est incorrecte et la paire clé/valeur en question ne le sera pas être retourné.

J'ai fait la var_dump($ids); avant la ligne 178 dans entity.inc ($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;)

Et il me semble que la paire clé/valeur est toujours au format correct (?).

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)
37
Ajinkya Kulkarni

La cause la plus courante de cette erreur est l'utilisation d'une fonction something_load () avec un tableau en argument. Ceci n'est plus supporté car les fonctions load_multiple () doivent maintenant être utilisées pour cela.

Exemple en 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);
?>

Ainsi, le moyen le plus simple d’attraper ces problèmes est de rechercher "_load (array").

86
Berdir

J'ai rencontré la même erreur array_flip ce week-end en essayant de mettre à niveau un module personnalisé vers Drupal 7. Le problème est qu'un tableau imbriqué est en train d'être transmis à DrupalDefaultEntityController, mais il attend un tableau simple d'entiers ou de chaînes. Dans mon cas, je passais dans un tableau imbriqué à EntityFieldQuery, alors qu'il ne voulait qu'un tableau d'entiers.

Pour mieux retrouver le code qui appelle DrupalDefaultEntityController, essayez d'insérer ce qui suit avant la ligne 178 dans entity.inc:

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

... ou de préférence, installez le module Devel et essayez d'insérer les éléments suivants:

dpm( debug_backtrace() );
10
Matt V.

Le problème se pose lorsque vous utilisez l'accès au champ Groupes organiques (Groupes organiques 7.x-1.3)

Vous pouvez généralement désactiver ce sous-module, sauf si vous effectuez un contrôle d'accès au niveau du champ avec OG.

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

6
Johnathan Elmore

Cela peut également arriver lorsque vous appelez entity_load avec un tableau qui n'est pas un tableau d'identificateurs d'entité comme second argument - voir http://api.drupal.org/api/drupal/includes--common.inc/function/ entity_load/7 et http://drupal.org/node/1160566 pour comprendre pourquoi.

3
Evan Donovan

Vu un problème similaire dans notre utilisation du dernier module page_title. Pour l'instant, nous venons de désactiver le module et l'erreur a été corrigée.

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

1
Jeremy

Cela pourrait être un problème de codage incorrect (par exemple, charger des entités non valides ou exécuter un ancien code Drupal 6 dans Drupal 7): 

  • Si vous avez des modules personnalisés, vérifiez votre code pour l'erreur commune
  • Si vous utilisez le module contrib, trouvez le bon bogue et appliquez le correctif (si disponible) ou relancez le nouveau.

Dépannage:

  • Vous pouvez essayer de vider la trace en appelant et en imprimant print_r(debug_backtrace()),
  • Utilisez votre outil scm pour revenir au point où il fonctionnait bien et comparez les modifications. Vous finirez par trouver le problème (par exemple, gitk, git log --patch, etc.).
  • veuillez utiliser Coder Review module pour rechercher les bogues dans votre code après la mise à jour (par exemple drush --contrib --no-empty --upgrade7x coder-review).
  • Installez XDebug pour suivre votre problème par journal de suivi ou par débogage étape par étape.

Sinon, vous pouvez déboguer votre code en définissant le hook temporaire suivant:

/**
 * 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());
  }
}

Effacez le cache avant de le tester.

Il va imprimer la trace sur chaque avertissement ou erreur PHP avec des arguments, de sorte que vous puissiez trouver vos paramètres non valides qui ont été passés dans le noyau de Drupal.

0
kenorb

Utilisez-vous le module d'insertion? Voir http://drupal.org/node/850946 .

En ce qui concerne des erreurs spécifiques telles que celle-ci, je pense que vous feriez mieux de chercher dans la file d'attente des problèmes sur drupal.org que de demander à SO.

0
marcvangend

Exemple de bon usage:

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

J'ai également reçu ce message lorsque je tentais par erreur de charger plusieurs nœuds via node_load_multiple ($ nids), où $ nids n'était pas un tableau d'identificateurs de nœud.

Par exemple, en utilisant le résultat d'un EntityFieldQuery et en appelant node_load_multiple ($ result ['node']) au lieu de node_load_multiple (array_keys ($ result ['node'])).

0
Enno