非法string偏移警告PHP
更新我的PHP版本到5.4.0-3后,我得到一个奇怪的PHP错误。
我有这个数组:
Array ( [host] => 127.0.0.1 [port] => 11211 )
当我尝试像这样访问它,我得到奇怪的警告
print $memcachedConfig['host']; print $memcachedConfig['port']; Warning: Illegal string offset 'host' in .... Warning: Illegal string offset 'port' in ...
我真的不想只编辑我的php.ini并重新设置错误级别。
感谢您的帮助!
请尝试这种方式….我已经testing了这个代码….它的工作….
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211"); print_r ($memcachedConfig['host']);
错误Illegal string offset 'whatever' in...
通常意味着:你正在尝试使用一个string作为一个完整的数组。
这实际上是可能的,因为string可以被视为在PHP单字符数组。 所以你认为$ var是一个带有键的数组,但是它只是一个带有标准数字键的string ,例如:
$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
你可以在这里看到这个: http : //ideone.com/fMhmkR
对于那些想要把这个错误的模糊性转化成这个问题的人来说,就像我一样。
TL; DR
你试图访问一个string
,就好像它是一个数组一样,一个键是一个string
。 string
不会理解的。 在代码中,我们可以看到问题:
"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.
深入
我们来看看这个错误:
警告:非法string偏移“端口”在…
它说什么? 它说我们正在尝试使用string'port'
作为string的偏移量。 喜欢这个:
$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 ...
这是什么原因?
出于某种原因,你期望一个array
,但你有一个string
。 只是一个混乱。 也许你的variables被改变了,也许它从来不是一个array
,这实际上并不重要。
可以做什么?
如果我们知道我们应该有一个array
,我们应该做一些基本的debugging,以确定为什么我们没有一个array
。 如果我们不知道是否有array
或string
,事情会变得有点棘手。
我们可以做的是各种检查,以确保我们没有通知,警告或错误,如is_array
和isset
或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 }
isset
和array_key_exists
之间有一些细微的差别。 例如,如果$array['key']
值为null
,则isset
返回false
。 array_key_exists
只会检查密钥是否存在 。
这里有很多很好的答案,但是我发现我的问题比较简单。
我试图运行以下命令:
$x['name'] = $j['name'];
而我在$x['name']
上得到了这个illegal string
错误,因为我没有先定义数组。 所以我把下面这行代码放入$x[]
:
$x = array();
它的工作。
从PHP 5.4开始,我们需要传递函数所期望的相同的数据types值。 例如:
function testimonial($id); // This function expects $id as an integer
当调用这个函数时,如果提供一个string值,像这样:
$id = $array['id']; // $id is of string type testimonial($id); // illegal offset warning
由于数据types不匹配,这将产生非法偏移警告。 为了解决这个问题,你可以使用settype
:
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string testimonial($id); // now running smoothly
在检查数组之前,请执行以下操作:
if(!is_array($memcachedConfig)) $memcachedConfig = array();
在我的情况下,我将mysql_fetch_assoc更改为mysql_fetch_array并解决。 这需要3天的时间来解决: – (和我的proyect其他版本运行fetch assoc。
只是为了扩大这一点。 同样的错误,不同的问题。
我只是检查一个不存在的值,因为我在一个更大的数组中混合了单维和multidimensional array。 所以,当我检查$ array ['key']时,它会在没有关联['key']的项目上抛出一个'Illegal String'错误。 仅供参考。
只要incase它可以帮助任何人,我得到这个错误,因为我忘记了反序列化一个序列化的数组。 这绝对是我会检查,如果它适用于你的情况。
这是一个旧的,但如果有人可以从中受益。 如果你的数组是空的,你也会得到这个错误。
在我的情况下,我有:
$buyers_array = array(); $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array ... echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname'];
我改为:
$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'; }
在我的情况下,我解决了它,当我改变了函数, SQL查询之后: return json_encode($array)
然后: return $array