Je reçois une étrange erreur PHP après la mise à jour de ma version de PHP vers la version 5.4.0-3.
J'ai ce tableau:
Array
(
[Host] => 127.0.0.1
[port] => 11211
)
Quand j'essaye d'y accéder comme ça, je reçois d'étranges avertissements
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 redéfinir le niveau d'erreur.
S'il vous plaît essayez de cette façon .... J'ai testé ce code .... Cela 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 que vous essayez d'utiliser une chaîne comme un tableau complet.
C'est effectivement possible puisque les chaînes peuvent être traitées comme des tableaux de caractères uniques en php. Donc, vous pensez que $ var est un tableau avec une clé, mais c'est juste un string 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 voir ceci en action ici: http://ideone.com/fMhmkR
Pour ceux qui en viennent à cette question, essayant de traduire le flou de l'erreur en quelque chose à faire à ce sujet, comme je l'étais.
Vous essayez d'accéder à une string
comme s'il s'agissait d'un tableau, avec une clé qui est une string
. string
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.
Avertissement: décalage de chaîne 'port' illégal dans ...
Ça dit quoi? Il dit que nous essayons d'utiliser la chaîne 'port'
comme un décalage pour une chaîne. Comme ça:
$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 ...
Pour une raison quelconque, vous vous attendiez à une array
, mais vous avez une string
. Juste une confusion. Peut-être que votre variable a été changée, peut-être que ce n’est jamais une array
, ce n’est vraiment pas important.
Si nous savons, nous devrions avoir une array
, nous devrions procéder à un débogage de base pour déterminer pourquoi nous n'avons pas de array
. Si nous ne savons pas si nous aurons une array
ou string
, la situation deviendra un peu plus compliquée.
Ce que nous pouvons faisons, c’est toutes sortes de vérifications pour nous assurer que nous n’avons pas d’avis, d’avertissements ou d’erreurs telles que 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 des différences subtiles entre isset
et array_key_exists
. Par exemple, si la valeur de $array['key']
est null
, isset
renvoie false
. array_key_exists
vérifiera simplement que, bien, la clé existe.
Il y a beaucoup de bonnes réponses ici - mais j'ai trouvé que 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 au préalable. Donc, je mets la ligne de code suivante avant d'essayer d'attribuer des choses à $x[]
:
$x = array();
et cela a fonctionné.
À partir de PHP 5.4, nous devons transmettre 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 d'une incompatibilité de type de données. Pour 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 tard pour la question, mais pour les autres qui cherchent: 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
Dans mon cas, je change de mysql_fetch_assoc en mysql_fetch_array et je résous Il faut 3 jours pour résoudre :-( et les autres versions de mon projet fonctionnent avec fetch assoc.
Avant de vérifier le tableau, procédez comme suit:
if(!is_array($memcachedConfig))
$memcachedConfig = array();
Juste au cas où cela aiderait n'importe qui, je recevais cette erreur parce que j'avais oublié de désérialiser un tableau sérialisé C'est certainement quelque chose que je vérifierais si cela s'applique à votre cas.
juste utiliser
$memcachedConfig = array();
avant
print $memcachedConfig['Host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'Host' in ....
Warning: Illegal string offset 'port' in ....
c'est parce que vous ne définissez jamais ce qu'est $ memcachedConfig, donc, par défaut, ils sont traités par des chaînes et non par des tableaux.
Dans mon cas, je l'ai résolu quand j'ai changé de fonction qui fait sql query After: return json_encode($array)
Then: return $array
Cela fonctionne pour moi:
Code d'essai 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
C'est un vieux, 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';
}
J'ai résolu ce problème en utilisant la fonction trim (). le problème était avec l'espace.
alors laisse essayer
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
J'espère que cela t'aidera.