Offset stringa illegale Avviso PHP


194

Ottengo uno strano errore PHP dopo aver aggiornato la mia versione php alla 5.4.0-3.

Ho questo array:

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

Quando provo ad accedervi in ​​questo modo ricevo strani avvisi

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


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

Non voglio davvero solo modificare il mio php.ini e reimpostare il livello di errore.


20
Ovviamente $memcachedConfignon è quell'array. Spettacolovar_dump($memcachedConfig);
zerkms,

1
Significa che le chiavi non esistono. Controlla la tua variabile con var_export($memcachedConfig)appena prima della "stampa".
Skrol29,

9
Ciò che la maggior parte delle persone ha perso è che questo non significa esattamente che l'indice non esiste - che produce un messaggio "indice indefinito". Questo è un errore diverso.
grantwparks,

5
stackoverflow.com/a/20271518/2898712 è la risposta corretta qui.
wedi,

19
Attenzione a chiunque visualizzi questa domanda: la risposta corretta a questa domanda non è quella contrassegnata; corretto è Kzqai sotto
Aaron

Risposte:


37

Per favore prova così .... Ho testato questo codice .... Funziona ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);

1
Trovato. Grazie per l'aiuto. var_dump ha aiutato. Ho caricato l'array da un file di configurazione, che aveva il contenuto di strage in questo modo. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 ora $ xx [' host "] ha lanciato l'avviso correttamente.
thesonix,

Ho avuto lo stesso errore dopo un include_once($file);. L'array è stato creato correttamente (le informazioni di debug lo mostrano), tuttavia è stato necessario copiarlo manualmente in un altro array prima di essere utilizzabile senza il messaggio di avviso PHP illegale.
Franz Holzinger,

$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Come correggere lo stesso errore qui Avvertenza: Offset stringa illegale
J. Shabu

303

L'errore Illegal string offset 'whatever' in...generalmente significa: stai cercando di usare una stringa come un array completo.

Ciò è effettivamente possibile poiché le stringhe possono essere trattate come matrici di singoli caratteri in php. Quindi stai pensando che $ var sia un array con una chiave, ma è solo una stringa con tasti numerici standard, ad esempio:

$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

Puoi vederlo in azione qui: http://ideone.com/fMhmkR

Per coloro che arrivano a questa domanda, cercano di tradurre la vaghezza dell'errore in qualcosa da fare al riguardo, come lo ero io.


8
Scommetto che si può dimostrare che questo è stato il motivo per cui si è verificato il problema originale. La maggior parte dei commenti presume erroneamente che "indice indefinito" fosse l'errore.
grantwparks,

1
Ho affrontato questo problema in un ciclo while. Grazie
David Okwii il

A volte questo errore può verificarsi quando si tenta di afferrare il nodo errato di un array multidimensionale, ovvero andare "troppo in profondità", è invece necessario il genitore della selezione
zoltar,

Questo è corretto, ho usato fetchAll(PDO::FETCH_ASSOC)invece fetch(PDO::FETCH_ASSOC)e ha funzionato perfettamente.
MNN,

Per sbaglio ho usato lo stesso $variablename = [];due volte, in un'altra parte del mio codice con $variablename = "test";cui ho causato il messaggio di errore.
Kai Noack,

77

TL; DR

Stai tentando di accedere a stringcome se fosse un array, con una chiave che è a string. stringnon lo capirò. Nel codice possiamo vedere il problema:

"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 profondità

Vediamo quell'errore:

Avvertenza: offset 'stringa' della stringa illegale in ...

Cosa dice? Dice che stiamo cercando di usare la stringa 'port'come offset per una stringa. Come questo:

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

Cosa causa questo?

Per qualche motivo ti aspettavi un array, ma hai un string. Solo un pasticcio. Forse la tua variabile è stata cambiata, forse non lo è mai stataarray , non è davvero importante.

Cosa si può fare?

Se sappiamo che dovremmo avere un array, dovremmo fare alcuni debug di base per determinare perché non ne abbiamo uno array. Se non sappiamo se avremo un arrayo string, le cose diventeranno un po 'più complicate.

Quello che possiamo fare è effettuare ogni tipo di controllo per assicurarci di non avere avvisi, avvertenze o errori con cose come is_arraye isseto 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
}

Ci sono alcune sottili differenze tra issete array_key_exists. Ad esempio, se il valore di $array['key']è null, issetrestituisce false. array_key_existscontrollerò che, beh, la chiave esiste .


13

Ci sono molte ottime risposte qui - ma ho scoperto che il mio problema era un po 'più semplice.

Stavo cercando di eseguire il seguente comando:

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

e ho riscontrato questo illegal stringerrore $x['name']perché non avevo prima definito l'array. Quindi ho inserito la seguente riga di codice prima di provare ad assegnare cose a $x[]:

$x = array();

e ha funzionato.


1
Penso che questa dovrebbe essere la risposta. Questo deve essere diverso tra 5.4 (e il precedente a 7) e 7.
sonetto

7

Un po 'in ritardo alla domanda, ma per gli altri che stanno cercando: ho ottenuto questo errore inizializzando con un valore errato (tipo):

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

Il modo giusto è:

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

Laddove $ varName viene inizializzato da un valore che dovrebbe essere un array ma che può essere una stringa vuota, forzare il valore può evitarlo, ad esempio: $ varName = (array) $ shouldBeArray
markdwhite

4

A partire da PHP 5.4 è necessario passare lo stesso valore del tipo di dati previsto da una funzione. Per esempio:

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

Quando si richiama questa funzione, se viene fornito un valore stringa come questo:

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

Ciò genererà un avviso di offset illegale a causa della mancata corrispondenza del tipo di dati. Per risolvere questo problema, puoi utilizzare settype:

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

In che modo ciò ha a che fare con le matrici ...?
un utente non descrittivo il

2

Prima di controllare l'array, procedere come segue:

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

1

Nel mio caso cambio mysql_fetch_assoc in mysql_fetch_array e risolvo. Ci vogliono 3 giorni per risolvere :-( e le altre versioni del mio proyect funzionano con fetch assoc.


1

Nel mio caso, l'ho risolto quando ho cambiato funzione che fa query sql dopo: return json_encode($array) quindi:return $array


1

Funziona per me:

Codice di prova mio:

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

Produzione: 55

Dai un'occhiata ragazzi. Grazie


1

basta usare

$memcachedConfig = array();

prima

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


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

questo perché non si definisce mai ciò che è $ memcachedConfig, quindi per impostazione predefinita vengono trattati da stringhe non matrici.


1

Ho risolto questo problema usando la funzione trim (). il problema era con lo spazio.

dunque proviamo

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

Spero che questo ti possa aiutare.


0

In caso contrario, aiuta chiunque, ho riscontrato questo errore perché ho dimenticato di annullare la serializzazione di un array serializzato. È sicuramente qualcosa che vorrei verificare se si applica al tuo caso.


0

È vecchio ma nel caso qualcuno ne possa beneficiare. Riceverai anche questo errore se l'array è vuoto.

Nel mio caso avevo:

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

che ho cambiato in:

$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

penso che l'unico motivo di questo messaggio sia perché l'array target è in realtà un array come stringa etc (JSON -> {"host": "127.0.0.1"}) variabile


0

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

}

Assicurati solo di verificare che il valore restituito non sia vuoto. Quindi questo esempio è stato per PHP, quindi scopri come verificare se un array è vuoto in altre lingue.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.