Avertissement de décalage de chaîne illégal PHP
Je reçois une étrange erreur PHP après la mise à jour de ma version php à 5.4.0-3.
J'ai ce tableau:
Array
(
[host] => 127.0.0.1
[port] => 11211
)
Quand j'essaie d'y accéder comme ceci, j'obtiens des avertissements étranges
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ...
Je ne veux vraiment pas juste éditer mon php.ini et re-définir le niveau d'erreur.
12 réponses
Veuillez essayer de cette façon.... J'ai testé ce code.... Elle fonctionne....
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['host']);
L'erreur Illegal string offset 'whatever' in...
signifie généralement: vous essayez d'utiliser une chaîne comme un ensemble complet.
C'est en fait possible puisque les chaînes peuvent être traitées comme des tableaux de caractères simples en php. Donc, vous pensez que $var est un tableau avec une clé, mais c'est juste une chaîne avec des clés numériques standard, par exemple:
$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
Vous pouvez le voir en action ici: http://ideone.com/fMhmkR
Pour ceux qui viennent à cette question en essayant de traduire le flou de l'erreur dans quelque chose à faire à ce sujet, comme je l'ai été.
TL; DR
Vous essayez d'accéder à un string
, comme si c'était un tableau, avec une clé qui est un string
. {[3] } ne comprendra pas cela. Dans le code, nous pouvons voir le problème:
"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.
En profondeur
Voyons cette erreur:
Avertissement: décalage de chaîne illégal 'port' dans ...
Que faut-il dire? Il dit que nous essayons d'utiliser la chaîne 'port'
comme décalage pour une chaîne. Comme ceci:
$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'est-ce qui cause cela?
Pour certains raison pour laquelle vous attendiez un array
, mais vous avez un string
. Juste un mix-up. Peut-être que votre variable a été modifiée, peut-être qu'elle n'a jamais été un array
, ce n'est vraiment pas important.
Que peut-on faire?
Si nous savoir, nous devrions avoir un array
, on devrait faire de la base de débogage afin de déterminer pourquoi nous n'avons pas de array
. Si nous ne savons pas si nous aurons un array
ou string
, les choses deviennent un peu plus compliqué.
Ce que nous pouvons faire, c'est toutes sortes de vérifications pour nous assurer que nous n'avons pas des avis, des avertissements ou des erreurs avec des choses comme is_array
et isset
ou 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
}
, Il existe quelques petites différences entre les isset
et array_key_exists
. Par exemple, si la valeur de $array['key']
est null
, isset
retourne false
. array_key_exists
va juste vérifier que, eh bien, la clé existe.
Il y a beaucoup de réponses ici, mais j'ai trouvé mon problème était un peu plus simple.
J'essayais d'exécuter la commande suivante:
$x['name'] = $j['name'];
Et je recevais cette erreur illegal string
sur $x['name']
parce que je n'avais pas défini le tableau en premier. J'ai donc mis la ligne de code suivante avant d'essayer d'assigner des choses à $x[]
:
$x = array();
Et ça a marché.
À partir de PHP 5.4, nous devons passer la même valeur de type de données qu'une fonction attend. Par exemple:
function testimonial($id); // This function expects $id as an integer
Lors de l'appel de cette fonction, si une valeur de chaîne est fournie comme ceci:
$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning
Cela générera un avertissement de décalage illégal en raison de l'incompatibilité de type de données. Afin de résoudre ce problème, vous pouvez utiliser settype
:
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Un peu en retard à la question, mais pour les autres qui recherchent: j'ai eu cette erreur en initialisant avec une mauvaise valeur (type):
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
La bonne façon est:
$varName = array();
$varName["x"] = "test"; // works
Avant de vérifier le tableau, faites ceci:
if(!is_array($memcachedConfig))
$memcachedConfig = array();
Dans mon cas, je change mysql_fetch_assoc en mysql_fetch_array et résous. Il faut 3 jours pour résoudre : - (et les autres versions de mon proyect fonctionnent avec fetch assoc.
Juste au cas où cela aiderait n'importe qui, je recevais cette erreur parce que j'ai oublié de désérialiser un tableau sérialisé. C'est certainement quelque chose que je vérifierais si cela s'applique à votre cas.
C'est un ancien mais au cas où quelqu'un pourrait en bénéficier. Vous obtiendrez également cette erreur si votre tableau est vide.
Dans mon cas, j'avais:
$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname'];
Que j'ai changé en:
$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';
}
Dans mon cas, je l'ai résolu quand j'ai changé de fonction qui n' sql requête
après: return json_encode($array)
alors: return $array
Cela fonctionne pour moi:
Code de test de la mine:
$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{
$test = $result['c'];
}
print_r($test);
Sortie: 55
Vérifiez les gars. Merci