J'obtiens une erreur PHP étrange après la mise à jour de ma version php vers 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, j'obtiens 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 simplement modifier mon php.ini et redéfinir le niveau d'erreur.
$memcachedConfig
n'est évidemment pas ce tableau. Spectaclevar_dump($memcachedConfig);
var_export($memcachedConfig)
juste avant le "print".Réponses:
Veuillez essayer de cette façon ... J'ai testé ce code ... Cela fonctionne ...
la source
include_once($file);
. Le tableau a été construit correctement (les informations de débogage le montrent), mais il a dû être copié manuellement dans un autre tableau avant d'être utilisable sans le message d'avertissement PHP de décalage de chaîne illégal.L'erreur
Illegal string offset 'whatever' in...
signifie généralement: vous essayez d'utiliser une chaîne comme tableau complet.C'est en fait possible puisque les chaînes peuvent être traitées comme des tableaux de caractères uniques en php. Vous pensez donc que $ var est un tableau avec une clé, mais c'est juste une chaîne avec des touches numériques standard, par exemple:
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 en quelque chose à faire à ce sujet, comme je l'étais.
la source
fetchAll(PDO::FETCH_ASSOC)
placefetch(PDO::FETCH_ASSOC)
et a parfaitement fonctionné.$variablename = [];
deux fois, dans une autre partie de mon code avec$variablename = "test";
laquelle le message d'erreur a été causé.TL; DR
Vous essayez d'accéder à un
string
comme s'il s'agissait d'un tableau, avec une clé qui est unstring
.string
ne comprendra pas cela. Dans le code, nous pouvons voir le problème:En profondeur
Voyons cette erreur:
Ça dit quoi? Il dit que nous essayons d'utiliser la chaîne
'port'
comme décalage pour une chaîne. Comme ça:Qu'est-ce qui cause cela?
Pour une raison quelconque, vous vous attendiez à un
array
, mais vous avez unstring
. Juste une confusion. Peut-être que votre variable a été modifiée, peut-être qu'elle n'a jamais été unarray
, ce n'est vraiment pas important.Ce qui peut être fait?
Si nous savons que nous devrions avoir un
array
, nous devrions effectuer un débogage de base pour déterminer pourquoi nous n'avons pas de fichierarray
. Si nous ne savons pas si nous aurons unarray
oustring
, les choses deviennent un peu plus délicates.Ce que nous pouvons faire, c'est toutes sortes de vérifications pour nous assurer que nous n'avons pas d'avis, d'avertissements ou d'erreurs avec des choses comme
is_array
etisset
ouarray_key_exists
:Il existe des différences subtiles entre
isset
etarray_key_exists
. Par exemple, si la valeur de$array['key']
estnull
,isset
renvoiefalse
.array_key_exists
va juste vérifier que, eh bien, la clé existe .la source
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:
et j'obtenais cette
illegal string
erreur$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[]
:et cela a fonctionné.
la source
Un peu en retard à la question, mais pour les autres qui recherchent: j'ai eu cette erreur en initialisant avec une mauvaise valeur (type):
La bonne manière est:
la source
À partir de PHP 5.4, nous devons transmettre la même valeur de type de données qu'une fonction attend. Par exemple:
Lors de l'appel de cette fonction, si une valeur de chaîne est fournie comme ceci:
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
:la source
Avant de vérifier la baie, procédez comme suit:
la source
Dans mon cas, je change mysql_fetch_assoc en mysql_fetch_array et je résolve. Cela prend 3 jours pour résoudre :-( et les autres versions de mon projet fonctionnent avec fetch assoc.
la source
Dans mon cas, je l'ai résolu lorsque j'ai changé de fonction qui fait une requête SQL après:
return json_encode($array)
puis:return $array
la source
Cela fonctionne pour moi:
Code de test de la mienne:
Production:
55
Vérifiez les gars. Merci
la source
juste utiliser
avant
c'est parce que vous ne définissez jamais ce qu'est $ memcachedConfig, donc par défaut sont traités par chaîne et non par tableaux.
la source
J'ai résolu ce problème en utilisant la fonction trim (). le problème était celui de l'espace.
alors essayons
J'espère que cela t'aidera.
la source
Juste au cas où cela aiderait n'importe qui, j'obtenais 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.
la source
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:
que j'ai changé en:
la source
Je pense que la seule raison de ce message est parce que le tableau cible est en fait un tableau comme la variable string etc (JSON -> {"host": "127.0.0.1"})
la source
Pour PHP
Assurez-vous simplement de vérifier que la valeur renvoyée n'est pas vide. Donc cet exemple était pour PHP alors découvrez comment vérifier si un tableau est vide dans d'autres langues.
la source