web-dev-qa-db-fra.com

Avertissement de chaîne illicite PHP

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.

155
thesonix

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']);
34
letsnurture

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.

235
Kzqai

TL; DR

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.

En profondeur

Voyons cette erreur:

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

Qu'est-ce qui cause ça?

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.

Ce qui peut être fait?

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.

62
Jon Surrell

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é.

9
Brian Powell

À 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
4
Anirudh Sood

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
4
Marco

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.

1
Pichitron

Avant de vérifier le tableau, procédez comme suit:

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

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.

0
Marc

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.

0
chayankQ

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 

0
Kleber Caldas

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

0

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';
}
0
edo.b hiortee

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.

0