Unzulässiger String-Offset Warnung PHP

193

Ich erhalte einen seltsamen PHP-Fehler, nachdem ich meine PHP-Version auf 5.4.0-3 aktualisiert habe.

Ich habe dieses Array:

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

Wenn ich versuche, so darauf zuzugreifen, erhalte ich seltsame Warnungen

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

Ich möchte wirklich nicht nur meine php.ini bearbeiten und die Fehlerstufe zurücksetzen.

thesonix
quelle
20
Offensichtlich $memcachedConfigist das nicht Array. Showvar_dump($memcachedConfig);
zerkms
1
Dies bedeutet, dass die Schlüssel nicht vorhanden sind. Überprüfen Sie Ihre Variable mit var_export($memcachedConfig)kurz vor dem "Drucken".
Skrol29
9
Was die meisten Leute vermisst haben, ist nicht genau, dass der Index nicht existiert - das erzeugt die Nachricht "undefinierter Index". Dies ist ein anderer Fehler.
Grantwparks
5
stackoverflow.com/a/20271518/2898712 ist hier die richtige Antwort.
Mi
19
Achtung, wer diese Frage sieht: Die richtige Antwort auf diese Frage ist nicht die markierte; richtig ist Kzqai unten
Aaron

Antworten:

37

Bitte versuchen Sie es auf diese Weise .... Ich habe diesen Code getestet .... Es funktioniert ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
Lass uns pflegen
quelle
1
Fand es. Danke für Ihre Hilfe. var_dump hat geholfen. Ich habe das Array aus einer Konfigurationsdatei geladen, die den Strage-Inhalt wie folgt hatte. Array (2) {["Host"] => String (9) "127.0.0.1" ["Port"] => String (5) "11211"} String (5) "m_prefix" PHP 5.4 jetzt $ xx [' Host '] warf die Warnung korrekt.
Thesonix
Ich hatte den gleichen Fehler nach einem include_once($file);. Das Array wurde korrekt erstellt (die Debug-Informationen zeigen dies), musste jedoch manuell in ein anderes Array kopiert werden, bevor es ohne die PHP-Warnmeldung "Ungültiger Stringoffset" verwendet werden konnte.
Franz Holzinger
$ sStartDate = Datum ("Ymd", strtotime ($ feed ['DTSTART'] ['Wert'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); So beheben Sie den gleichen Fehler hier Warnung: Unzulässiger String-Offset
J. Shabu
302

Der Fehler Illegal string offset 'whatever' in...bedeutet im Allgemeinen: Sie versuchen, eine Zeichenfolge als vollständiges Array zu verwenden.

Dies ist tatsächlich möglich, da Strings in PHP als Arrays einzelner Zeichen behandelt werden können. Sie denken also, $ var ist ein Array mit einem Schlüssel, aber es ist nur eine Zeichenfolge mit numerischen Standardschlüsseln, zum Beispiel:

$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

Sie können dies hier in Aktion sehen: http://ideone.com/fMhmkR

Für diejenigen, die zu dieser Frage kommen und versuchen, die Unbestimmtheit des Fehlers in etwas zu übersetzen, das sie tun können, wie ich es war.

Kzqai
quelle
8
Ich wette, es kann gezeigt werden, dass dies der Grund war, warum das ursprüngliche Problem aufgetreten ist. Die meisten Kommentare gehen fälschlicherweise davon aus, dass "undefinierter Index" der Fehler war.
Grantwparks
1
Ist in einer while-Schleife auf dieses Problem gestoßen. Vielen Dank
David Okwii
Manchmal kann dieser Fehler auftreten, wenn versucht wird, den falschen Knoten eines mehrdimensionalen Arrays zu
erfassen
Das ist richtig, ich habe fetchAll(PDO::FETCH_ASSOC)stattdessen verwendet fetch(PDO::FETCH_ASSOC)und perfekt gearbeitet.
MNN
Aus Versehen habe ich dasselbe $variablename = [];zweimal an einem anderen Teil meines Codes verwendet, mit $variablename = "test";dem die Fehlermeldung verursacht wurde.
Kai Noack
77

TL; DR

Sie versuchen, auf stringein Array zuzugreifen, als wäre es ein Array mit einem Schlüssel, der a ist string. stringwerde das nicht verstehen. Im Code können wir das Problem sehen:

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

In der Tiefe

Lassen Sie uns diesen Fehler sehen:

Warnung: Unzulässiger String-Offset 'Port' in ...

Was sagt es? Es heißt, wir versuchen, die Zeichenfolge 'port'als Offset für eine Zeichenfolge zu verwenden. So was:

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

Was verursacht das?

Aus irgendeinem Grund haben Sie eine erwartet array , aber Sie haben eine string. Nur eine Verwechslung. Vielleicht wurde Ihre Variable geändert, vielleicht war es nie eine array, es ist wirklich nicht wichtig.

Was kann getan werden?

Wenn wir wissen, dass wir eine haben sollten array, sollten wir einige grundlegende Fehlerbehebungen durchführen, um festzustellen, warum wir keine haben array. Wenn wir nicht wissen, ob wir ein arrayoder haben werdenstring , werden die Dinge etwas schwieriger.

Was wir tun können , sind alle Arten von Überprüfungen, um sicherzustellen, dass wir keine Hinweise, Warnungen oder Fehler mit Dingen wie is_arrayund issetoder haben 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
}

Es gibt einige subtile Unterschiede zwischen issetund array_key_exists. Wenn beispielsweise der Wert von $array['key']ist null, wird issetzurückgegeben false. array_key_existsIch werde nur überprüfen, ob der Schlüssel existiert .

Jon Surrell
quelle
13

Hier gibt es viele gute Antworten - aber ich fand mein Problem viel einfacher.

Ich habe versucht, den folgenden Befehl auszuführen:

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

und ich bekam diesen illegal stringFehler, $x['name']weil ich das Array nicht zuerst definiert hatte. Also habe ich die folgende Codezeile eingefügt, bevor ich versuche, Dinge zuzuweisen $x[]:

$x = array();

und es hat funktioniert.

Brian Powell
quelle
1
Ich denke, das sollte die Antwort sein. Dies muss der Unterschied zwischen 5.4 (und dem vor 7) und 7.
sonnb
7

Ein bisschen spät zur Frage, aber für andere, die suchen: Ich habe diesen Fehler durch Initialisieren mit einem falschen Wert (Typ) erhalten:

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

Der richtige Weg ist:

 $varName = array();
 $varName["x"] = "test"; // works
Marco
quelle
Wenn $ varName aus einem Wert initialisiert wird, der ein Array sein sollte, aber möglicherweise eine leere Zeichenfolge ist, kann dies durch Erzwingen des Werts vermieden werden, z. B.: $ VarName = (Array) $ shouldBeArray
markdwhite
4

Ab PHP 5.4 müssen wir denselben Datentypwert übergeben, den eine Funktion erwartet. Beispielsweise:

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

Wenn beim Aufrufen dieser Funktion ein Zeichenfolgenwert wie folgt angegeben wird:

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

Dies generiert eine unzulässige Offset-Warnung aufgrund einer Nichtübereinstimmung des Datentyps. Um dies zu lösen, können Sie Folgendes verwenden settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Anirudh Sood
quelle
Wie hat das mit Arrays zu tun ...?
einige-nicht-beschreibende-Benutzer
2

Gehen Sie folgendermaßen vor, um das Array zu überprüfen:

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

In meinem Fall ändere ich mysql_fetch_assoc in mysql_fetch_array und löse. Die Lösung dauert 3 Tage :-( und die anderen Versionen meines Proyect laufen mit fetch assoc.

Pichitron
quelle
1

In meinem Fall habe ich es gelöst, als ich die Funktion geändert habe, die SQL- Abfragen nach folgender return json_encode($array) Zeit ausführt : dann:return $array

Kleber Caldas
quelle
1

Es funktioniert bei mir:

Testcode von mir:

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

Ausgabe: 55

Überprüfen Sie es Jungs. Vielen Dank

Y. Joy Ch. Singha
quelle
1

benutz einfach

$memcachedConfig = array();

Vor

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ....

Dies liegt daran, dass Sie niemals definieren, was $ memcachedConfig ist. Daher werden standardmäßig Zeichenfolgen und keine Arrays behandelt.

chayankQ
quelle
1

Ich habe dieses Problem mit der Funktion trim () gelöst. Das Problem war mit dem Platz.

Lass es uns versuchen

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

Ich hoffe, dies wird dir helfen.

Jailendra Rajawat
quelle
0

Nur für den Fall, dass es jemandem hilft, habe ich diesen Fehler erhalten, weil ich vergessen habe, ein serialisiertes Array zu unserialisieren. Das ist definitiv etwas, das ich prüfen würde, wenn es auf Ihren Fall zutrifft.

Marc
quelle
0

Es ist alt, aber falls jemand davon profitieren kann. Sie erhalten diesen Fehler auch, wenn Ihr Array leer ist.

In meinem Fall hatte ich:

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

was ich geändert habe zu:

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

Ich denke, der einzige Grund für diese Nachricht ist, dass das Ziel-Array tatsächlich ein Array wie ein String usw. (JSON -> {"host": "127.0.0.1"}) ist

adnan ahmady
quelle
0

Für PHP

//Setup Array like so
$memcachedConfig = array(
  "host" => "127.0.0.1",
  "port" => "11211"
);

//Always a good practice to check if empty

if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){

    //Some codes

    print_r ($memcachedConfig['host']);
    print_r ($memcachedConfig['port']);

}

Stellen Sie einfach sicher, dass der zurückgegebene Wert nicht leer ist. Dieses Beispiel war für PHP gedacht. Finden Sie heraus, wie Sie überprüfen können, ob ein Array in anderen Sprachen leer ist.

Delorme Grant
quelle