2011-01-25 18 views
37

he migrado recientemente mi módulo para Drupal7 (en PHP versión 5.3.1) y ahora estoy consiguiendo errores siguientes:array_flip(): ¡Solo se pueden voltear los valores de STRING e INTEGER! en DrupalDefaultEntityController-> load()

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

también he intentado actualizar otros módulos y el núcleo a versiones más recientes que se han mencionado aquí http://drupal.org/node/1022736

entidad 7.x-1.x-dev (2011-ene-24), vistas 7.x-3.x-dev (2011-ene-22), el núcleo de Drupal 7.x-dev (2011-Jan-24), profile2 7.x-1.0-beta1, referencias 7.x-2.x-dev (2011-Jan-14), ctools 7.x-1.0- alpha2

¿No puedo averiguar qué está causando exactamente este error?

Editar:

Según http://php.net/manual/en/function.array-flip.php,

array_flip() devuelve una matriz en orden flip, es decir, llaves de trans convierten en valores y valores de claves trans convertido.

Tenga en cuenta que los valores de trans deben ser claves válidas, es decir, deben ser enteros o de cadena. Se emitirá una advertencia si un valor tiene el tipo incorrecto, y el par clave/valor en cuestión no se invertirá .

he hecho la var_dump($ids); antes de la línea 178 en entity.inc ($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;)

Y parece a mí que par clave/valor es siempre en el formato correcto (?).

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

¿Migró su módulo o sitio a drupal 7? si es un módulo personalizado, ¿dónde está el código? También debe intentar apagar los módulos hasta que las advertencias desaparezcan para reducirlo más. Algo está dando los parámetros incorrectos. –

+0

Sí, he migrado mi módulo a Drupal 7. Pero el error está en el archivo entity.inc que es un archivo central de Drupal 7. –

+1

En cuanto al resultado var_dump anterior: No, en el par clave/valor es * no * en formato correcto. La función array_flip puede voltear una matriz como 'matriz (0 => 'a')', pero no 'matriz (0 => matriz (0 => 'a'))' porque la matriz anidada debería convertirse en la clave de matriz . – marcvangend

Respuesta

85

La causa más común de este error es utilizar una función something_load() con una matriz como argumento. Esto ya no es soportado porque las funciones load_multiple() necesitan ser usadas para esto ahora.

Ejemplo 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); 
?> 

Por lo tanto, la forma más fácil de atrapar estos es la búsqueda de "_load (array"

+0

Muchas gracias. Ese fue el problema. Estaba haciendo $ node = node_load (array ('nid' => $ node-> nid)); y $ thisUser = user_load (array ('uid' => $ service-> uid)) en muchos lugares. También gracias por la sugerencia de hacer una búsqueda rápida usando "_load (array". ¡Eso fue genial! –

+0

Gracias. He encontrado ejemplos de tal uso incluso en el núcleo: form.inc, módulo de activación. También módulos de comunidad "pathauto" & " page_title "sigue usando la sintaxis anterior. –

+2

o si intenta pasar valores nulos/falsos en las funciones de carga, por ejemplo: $ nid = null; node_load ($ null); –

0

¿Está utilizando el módulo de inserción? Ver http://drupal.org/node/850946.

Cuando se trata de errores específicos como este, creo que es mejor buscar la cola de problemas en drupal.org que preguntar en SO.

+0

Probablemente tengas razón. Necesito mirar mejor la cola de problemas en Drupal.org. Solo esperaba que si pudiera obtener algunas sugerencias sobre array_flip() y cómo no usarlo. –

+0

No. No estaba usando Insertar módulo. Solo los módulos que mencioné anteriormente. –

10

Me encontré con el mismo error de array_flip durante el fin de semana, tratando de actualizar un módulo personalizado a Drupal 7. El problema es que una matriz anidada pasa a DrupalDefaultEntityController, pero está esperando una matriz simple de enteros o cadenas. En mi caso, estaba pasando una matriz anidada a EntityFieldQuery, cuando solo quiere una matriz de enteros.

Para un mejor seguimiento por el código que está llamando DrupalDefaultEntityController, intente insertar lo siguiente antes de la línea 178 en entity.inc:

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

... o, preferiblemente, instale el módulo Devel y tratar de insertar la siguiente vez :

dpm(debug_backtrace()); 
-3

Aquí es una solución simple :)

Editar settings.php archivo y añadir esta línea

error_reporting(0); 
+3

1) No piratear el núcleo. 2) No hagas esto. Desactive los informes de errores en * sitios de producción * solo, después de que se haya completado el desarrollo, y hágalo de la manera correcta, a través de la IU de Drupal. –

+0

Lo que dijo Adam, o bien escriba su propio módulo para hacerlo en código, y solo habilite ese módulo en producción. – rhodesjason

6

El problema surge cuando se está usando el acceso Orgánica campo de grupos (grupos orgánicos 7.x-1,3)

Puede desactivar por lo general ese sub-módulo a menos que hagas campo de control de acceso a nivel con OG.

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

+0

Este fue mi problema - Logré rastrear lo que se estaba enviando y fue una gran cantidad de matrices que consisten en una matriz (0 => NULO) –

+0

Me lo arregló también. – Hank

+0

Lo mismo para mí; comportamiento extraño ... – jozi

-1

Gracias por el puesto que trabajó para mí !, me estaba encontrando con este problema en Drupal 7 desde hace mucho tiempo y podrían fighure el problema. En pocas palabras

"No deje pasar valores de la matriz a array_flip para cualquier tipo de entidades, por ejemplo: Si usted está tratando de cargar y user_load entidad() o field_collection_item_load() para los elementos de la colección de campo de carga, pasar únicamente los valores en la cadena de en lugar de la matriz en sí ".

Gracias!

0

Ejemplo de buen uso:

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

Esto podría ser un problema de la mala codificación (por ejemplo, la carga de entidades no válidos o correr algún viejo código de Drupal 6 en Drupal 7):

  • Si' ve ningún módulos personalizados, vuelva a comprobar el código de error común
    • uso no válido de entity_load(),
    • Pasando ar rayo de objetos cargados a entity_load(),
    • Comprobar Entity API y Example module que proporciona la forma correcta de utilizar Entidades en Drupal 7.
  • Si está utilizando el módulo contrib, encontrar el microbio adecuado en contra de ella y aplicar el parche (si está disponible) o levanta el nuevo.

Solución de problemas:

  • Usted puede tratar de volcar la traza llamando e imprimir print_r(debug_backtrace()),
  • Utilice la herramienta de SMC para volver al punto en el que estaba trabajando bien, y comparar los cambios , por lo que finalmente encontrará dónde está el problema (por ejemplo gitk, git log --patch, etc.)
  • favor utilice Coder Review módulo para encontrar errores en su código después de la actualización (por ejemplo drush --contrib --no-empty --upgrade7x coder-review).
  • Instale XDebug para realizar un seguimiento de su problema mediante el registro de seguimiento o la depuración paso a paso.

Alternativamente, puede depurar el código mediante la definición de la siguiente gancho temporal:

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

Borrar la caché antes de probarlo.

Imprimirá la traza inversa en cada advertencia de PHP o error con argumentos, para que pueda encontrar los parámetros no válidos que se pasaron al núcleo de Drupal.

Cuestiones relacionadas