Illegal string offset Warning PHP

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

I get a strange PHP error after updating my php version to 5.4.0-3.

I have this array:

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

When I try to access it like this I get strange warnings

 print $memcachedConfig['host'];  print $memcachedConfig['port'];    Warning: Illegal string offset 'host' in ....  Warning: Illegal string offset 'port' in ... 

I really don't want to just edit my php.ini and re-set the error level.

Thanks for any help!

回答1:

Please try this way.... I have tested this code.... It works....

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


回答2:

The error Illegal string offset 'whatever' in... generally means: you're trying to use a string as a full array.

That is actually possible since strings are able to be treated as arrays of single characters in php. So you're thinking the $var is an array with a key, but it's just a string with standard numeric keys, for example:

$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 

You can see this in action here: http://ideone.com/fMhmkR

For those who come to this question trying to translate the vagueness of the error into something to do about it, as I was.



回答3:

TL;DR

You're trying to access a string as if it were an array, with a key that's a string. string will not understand that. In code we can see the 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 depth

Let's see that error:

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

What does it say? It says we're trying to use the string 'port' as an offset for a string. Like this:

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

What causes this?

For some reason you expected an array, but you have a string. Just a mix-up. Maybe your variable was changed, maybe it never was an array, it's really not important.

What can be done?

If we know we should have an array, we should do some basic debugging to determine why we don't have an array. If we don't know if we'll have an array or string, things become a bit trickier.

What we can do is all sorts of checking to ensure we don't have notices, warnings or errors with things like is_array and isset or 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 } 

There are some subtle differences between isset and array_key_exists. For example, if the value of $array['key'] is null, isset returns false. array_key_exists will just check that, well, the key exists.



回答4:

There are a lot of great answers here - but I found my issue was quite a bit more simple.

I was trying to run the following command:

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

and I was getting this illegal string error on $x['name'] because I hadn't defined the array first. So I put the following line of code in before trying to assign things to $x[]:

$x = array(); 

and it worked.



回答5:

As from PHP 5.4 we need to pass the same datatype value that a function expects. For example:

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

When invoking this function, if a string value is provided like this:

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

This will generate an illegal offset warning because of datatype mismatch. In order to solve this, you can use settype:

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


回答6:

Before to check the array, do this:

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


回答7:

In my case i change mysql_fetch_assoc to mysql_fetch_array and solve. It takes 3 days to solve :-( and the other versions of my proyect run with fetch assoc.



回答8:

Just incase it helps anyone, I was getting this error because I forgot to unserialize a serialized array. That's definitely something I would check if it applies to your case.



回答9:

It's an old one but in case someone can benefit from this. You will also get this error if your array is empty.

In my case I had:

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

which I changed to:

$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'; } 


回答10:

In my case, I solved it when I changed in function that does sql query after: return json_encode($array) then: return $array



回答11:

A little bit late to the question, but for others who are searching: I got this error by initializing with a wrong value (type):

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

The right way is:

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!