webentwicklung-frage-antwort-db.com.de

Unzulässiger String-Offset Warnung PHP

Ich bekomme 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, bekomme ich seltsame Warnungen

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


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

Ich möchte meine php.ini wirklich nicht bearbeiten und die Fehlerstufe neu einstellen.

155
thesonix

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

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

Das ist tatsächlich möglich, da Strings als Arrays von einzelnen Zeichen in PHP behandelt werden können. Sie denken also, dass $ var ein Array mit einem Schlüssel ist, aber es ist nur ein string mit numerischen Standardschlüsseln, beispielsweise:

$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 in Aktion hier sehen: http://ideone.com/fMhmkR

Für diejenigen, die zu dieser Frage kommen und versuchen, die Ungenauigkeit des Fehlers in etwas umzuwandeln, so wie ich es tat.

235
Kzqai

TL; DR

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

"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 die Tiefe

Lassen Sie uns diesen Fehler sehen:

Warnung: Ungültiger String-Versatz 'Port' in ...

Was sagt es? Es heißt, wir versuchen, den String 'port' als Offset für einen String 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 array erwartet, aber Sie haben eine string. Nur eine Verwechslung. Vielleicht wurde Ihre Variable geändert, vielleicht war es nie ein array, es ist wirklich nicht wichtig.

Was kann man machen?

Wenn wir know ein _ array haben sollten, sollten wir ein paar grundlegende Debugging-Aktionen durchführen, um festzustellen, warum wir kein array haben. Wenn wir nicht wissen, ob wir array oder string haben, werden die Dinge ein bisschen schwieriger.

Was wir can tun, ist alle Arten von Überprüfungen, um sicherzustellen, dass wir keine Hinweise, Warnungen oder Fehler mit Dingen wie is_array und isset oder array_key_exists haben:

$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 Unterschiede zwischen isset und array_key_exists . Wenn der Wert von $array['key'] beispielsweise null ist, gibt issetfalse zurück. array_key_exists überprüft nur, ob der Schlüssel existiert.

62
Jon Surrell

Es gibt viele großartige Antworten - aber ich fand, dass mein Problem ein bisschen einfacher war.

Ich habe versucht, den folgenden Befehl auszuführen:

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

und ich erhielt diesen illegal string-Fehler bei $x['name'], da ich das Array nicht zuerst definiert hatte. Also füge ich die folgende Codezeile ein, bevor ich $x[] Dinge zuweisen wollte:

$x = array();

und es hat funktioniert.

9
Brian Powell

Ab PHP 5.4 müssen wir den gleichen Datentypwert übergeben, den eine Funktion erwartet. Zum Beispiel:

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

Wenn Sie diese Funktion aufrufen, wird ein String-Wert wie folgt angegeben:

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

Dies führt zu einer ungültigen Offset-Warnung, da der Datentyp nicht übereinstimmt. Um dies zu lösen, können Sie settype verwenden:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
4
Anirudh Sood

Ein wenig zu spät zur Frage, aber für andere, die suchen: Ich habe diesen Fehler erhalten, indem ich mit einem falschen Wert (Typ) initialisierte:

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

Der richtige Weg ist:

 $varName = array();
 $varName["x"] = "test"; // works
4
Marco

In meinem Fall ändere ich mysql_fetch_assoc in mysql_fetch_array und löse. Es dauert 3 Tage, um zu lösen :-( und die anderen Versionen meines Projekts laufen mit fetch assoc.

1
Pichitron

Bevor Sie das Array überprüfen, müssen Sie Folgendes tun:

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

Nur wenn es jedem hilft, erhielt ich diesen Fehler, weil ich vergessen hatte, ein serialisiertes Array zu desialisieren. Das ist definitiv etwas, das ich prüfen würde, wenn es auf Ihren Fall zutrifft.

0
Marc

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. Standardmäßig werden also Zeichenfolgen und keine Arrays behandelt.

0
chayankQ

In meinem Fall habe ich es gelöst, als ich in der Funktion änderte, dass sql query Nach: return json_encode($array) Dann: return $array 

0
Kleber Caldas

Es funktioniert für mich:

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

0

Es ist eine alte, aber falls jemand davon profitieren kann. Sie erhalten diese Fehlermeldung 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:

$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

Ich habe dieses Problem mit der trim () - Funktion gelöst. das Problem war mit dem Raum.

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.

0