40 votes

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

J'ai récemment migré mon module vers Drupal7 (avec la version PHP 5.3.1) et j'obtiens maintenant 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 à jour les autres modules et le noyau vers les dernières versions, comme indiqué ici. http://drupal.org/node/1022736

entité 7.x-1.x-dev (2011-Jan-24), views 7.x-3.x-dev (2011-Jan-22), Drupal core 7.x-dev (2011-janvier-24), profile2 7.x-1.0-beta1, references 7.x-2.x-dev (2011-jan-14), ctools 7.x-1.0-alpha2

Je ne parviens pas à comprendre ce qui cause exactement cette erreur ?

Edit :

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

array_flip() retourne un tableau dans un ordre inversé, c'est-à-dire que 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 qu'elles doivent être des entiers ou des chaînes de caractères. Un avertissement sera émis si une valeur valeur n'est pas du bon type, et la paire clé/valeur en question ne sera pas ne sera pas inversée.

J'ai fait le 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 bon format ( ?).

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)

0 votes

Avez-vous migré votre module ou votre site vers Drupal 7 ? Si c'est un module personnalisé, où se trouve le code ? Vous devriez également essayer de désactiver les modules jusqu'à ce que les avertissements disparaissent pour réduire le problème. Quelque chose donne les mauvais paramètres.

0 votes

Oui, j'ai migré mon module vers Drupal 7. Mais l'erreur se trouve dans le fichier entity.inc qui est un fichier de base de Drupal 7.

1 votes

En ce qui concerne la sortie var_dump ci-dessus : Non, dans la paire clé/valeur, il y a no dans le format correct. La fonction array_flip permet de retourner un tableau de la manière suivante array(0 => 'a') mais pas array(0 => array(0 => 'a')) car le tableau imbriqué devrait devenir la clé du tableau.

86voto

Berdir Points 5927

La cause la plus courante de cette erreur est l'utilisation d'une fonction something_load() avec un tableau comme argument. Ceci n'est plus supporté car les fonctions load_multiple() doivent ê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, la façon la plus simple de les attraper est de rechercher "_load(array".

0 votes

Merci beaucoup. C'était le problème. Je faisais $node = node_load(array('nid' => $node->nid)) ; et $thisUser = user_load(array('uid' => $service->uid)) à plusieurs endroits. Merci aussi pour le conseil de faire une recherche rapide en utilisant "_load(array". C'était génial !

1 votes

Merci. J'ai trouvé des exemples de cette utilisation même dans le noyau : form.inc, trigger module. Les modules communautaires "pathauto" et "page_title" utilisent toujours l'ancienne syntaxe.

2 votes

Ou si vous essayez de passer des valeurs nulles/fausses dans les fonctions de chargement, par exemple : $nid=null ; node_load($null) ;

10voto

Matt V. Points 6979

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

Pour mieux repérer 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 Développement et essayez d'insérer ce qui suit à la place :

dpm( debug_backtrace() );

6voto

Johnathan Elmore Points 200

Le problème se pose lorsque vous utilisez l'accès aux champs des groupes organiques (Organic Groups 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

0 votes

C'était mon problème - j'ai réussi à trouver ce qui était envoyé et c'était beaucoup de tableaux composés de array(0 => NULL)

3voto

Evan Donovan Points 326

Cela peut également se produire lorsque vous appelez entity_load avec un tableau qui n'est pas un tableau d'identifiants d'entités comme deuxième argument - voir http://api.drupal.org/api/drupal/includes--common.inc/function/entity_load/7 y http://drupal.org/node/1160566 pour comprendre pourquoi.

1voto

Jeremy Points 11

Nous avons constaté un problème similaire dans notre utilisation du dernier module page_title. Pour l'instant, nous avons simplement désactivé 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/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X