warning todos off ocultar los errores display_errors deactivate all php warnings

off - todos los errores php



Desvío de cadena ilegal Advertencia PHP (11)

TL; DR

Está intentando acceder a una string como si fuera una matriz, con una clave que es una string . string no entenderá eso. En el código podemos ver el problema:

"hello"["hello"]; // PHP Warning: Illegal string offset ''hello'' in php shell code on line 1 "hello"[0]; // No errors. array("hello" => "val")["hello"]; // No errors. This is *probably* what you wanted.

A fondo

Veamos ese error:

Advertencia: ''puerto'' de desplazamiento de cadena ilegal en ...

¿Qué dice? Dice que estamos tratando de usar la cadena ''port'' como un desplazamiento para una cadena. Me gusta esto:

$a_string = "string"; // This is ok: echo $a_string[0]; // s echo $a_string[1]; // t echo $a_string[2]; // r // ... // !! Not good: echo $a_string[''port'']; // !! Warning: Illegal string offset ''port'' in ...

¿Qué causa esto?

Por alguna razón, esperaba una array , pero tiene una string . Solo una confusión. Tal vez su variable fue cambiada, tal vez nunca fue una array , realmente no es importante.

¿Qué se puede hacer?

Si sabemos que deberíamos tener una array , deberíamos hacer una depuración básica para determinar por qué no tenemos una array . Si no sabemos si tendremos una array o string , las cosas se vuelven un poco más complicadas.

Lo que podemos hacer es todo tipo de comprobaciones para garantizar que no tengamos avisos, advertencias o errores con cosas como is_array y isset o array_key_exists :

$a_string = "string"; $an_array = array(''port'' => ''the_port''); if (is_array($a_string) && isset($a_string[''port''])) { // No problem, we''ll never get here. echo $a_string[''port'']; } if (is_array($an_array) && isset($an_array[''port''])) { // Ok! echo $an_array[''port'']; // the_port } if (is_array($an_array) && isset($an_array[''unset_key''])) { // No problem again, we won''t enter. echo $an_array[''unset_key'']; } // Similar, but with array_key_exists if (is_array($an_array) && array_key_exists(''port'', $an_array)) { // Ok! echo $an_array[''port'']; // the_port }

Hay algunas diferencias sutiles entre isset y array_key_exists . Por ejemplo, si el valor de $array[''key''] es null , isset devuelve false . array_key_exists simplemente comprobará que, bueno, la clave existe .

Recibo un extraño error de PHP después de actualizar mi versión de php a 5.4.0-3.

Tengo esta matriz:

Array ( [host] => 127.0.0.1 [port] => 11211 )

Cuando trato de acceder de esta manera recibo advertencias extrañas

print $memcachedConfig[''host'']; print $memcachedConfig[''port'']; Warning: Illegal string offset ''host'' in .... Warning: Illegal string offset ''port'' in ...

Realmente no quiero simplemente editar mi php.ini y volver a establecer el nivel de error.

¡Gracias por cualquier ayuda!


A partir de PHP 5.4, necesitamos pasar el mismo valor de tipo de datos que espera una función. Por ejemplo:

function testimonial($id); // This function expects $id as an integer

Al invocar esta función, si se proporciona un valor de cadena de esta manera:

$id = $array[''id'']; // $id is of string type testimonial($id); // illegal offset warning

Esto generará una advertencia de desplazamiento ilegal debido a la falta de correspondencia del tipo de datos. Para resolver esto, puedes usar settype :

$id = settype($array[''id''],"integer"); // $id now contains an integer instead of a string testimonial($id); // now running smoothly


Antes de verificar la matriz, haz esto:

if(!is_array($memcachedConfig)) $memcachedConfig = array();


Aquí hay muchas respuestas excelentes, pero descubrí que mi problema era bastante más simple.

Estaba intentando ejecutar el siguiente comando:

$x[''name''] = $j[''name''];

y estaba obteniendo este error de illegal string en $x[''name''] porque no había definido la matriz primero. Así que puse la siguiente línea de código antes de intentar asignar cosas a $x[] :

$x = array();

Y funcionó.


El error Illegal string offset ''whatever'' in... generalmente significa: estás tratando de usar una cadena como una matriz completa.

Eso es realmente posible ya que las cadenas pueden tratarse como matrices de caracteres individuales en php. Entonces, estás pensando que $ var es una matriz con una clave, pero es solo una cadena con claves numéricas estándar, por ejemplo:

$fruit_counts = array(''apples''=>2, ''oranges''=>5, ''pears''=>0); echo $fruit_counts[''oranges'']; // echoes 5 $fruit_counts = "an unexpected string assignment"; echo $fruit_counts[''oranges'']; // causes illegal string offset error

Puedes ver esto en acción aquí: http://ideone.com/fMhmkR

Para aquellos que llegan a esta pregunta tratando de traducir la vaguedad del error en algo que hacer al respecto, como lo fui yo.


En mi caso, cambio mysql_fetch_assoc a mysql_fetch_array y lo soluciono. Se necesitan 3 días para resolver :-( y las otras versiones de mi proyecto se ejecutan con fetch assoc.


En mi caso, lo resolví cuando cambié en la función que realiza la consulta SQL después: return json_encode($array) luego: return $array


Es viejo, pero en caso de que alguien se pueda beneficiar de esto. También obtendrá este error si su matriz está vacía.

En mi caso, tuve:

$buyers_array = array(); $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array ... echo $buyers_array[''firstname''] . '' '' . $buyers_array[''lastname''];

que cambié a:

$buyers_array = array(); $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array ... if(is_array($buyers_array)) { echo $buyers_array[''firstname''] . '' '' . $buyers_array[''lastname'']; } else { echo ''Buyers id '' . $this_buyer_id . '' not found''; }


Por favor, intente de esta manera ... He probado este código ... Funciona ...

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211"); print_r ($memcachedConfig[''host'']);


Solo en caso de que ayude a alguien, estaba recibiendo este error porque olvidé deserializar una matriz serializada. Eso es definitivamente algo que verificaría si se aplica a su caso.


Un poco tarde para la pregunta, pero para otros que están buscando: obtuve este error inicializando con un valor incorrecto (tipo):

$varName = ''''; $varName["x"] = "test"; // causes: Illegal string offset

El camino correcto es:

$varName = array(); $varName["x"] = "test"; // works