提问人:thesonix 提问时间:3/26/2012 最后编辑:Bharatathesonix 更新时间:7/27/2023 访问量:1002885
非法字符串偏移量警告 PHP
Illegal string offset Warning 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并重新设置错误级别。
答:
请尝试这种方式....我已经测试了这个代码......它有效......
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
评论
include_once($file);
该错误通常意味着:您正在尝试将字符串用作完整数组。Illegal string offset 'whatever' in...
这实际上是可能的,因为在 php 中可以将字符串视为单个字符的数组。所以你认为$var是一个带有键的数组,但它只是一个带有标准数字键的字符串,例如:
$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
对于那些来到这个问题的人,试图将错误的模糊性转化为可以解决它的事情,就像我一样。
评论
fetchAll(PDO::FETCH_ASSOC)
fetch(PDO::FETCH_ASSOC)
$variablename = [];
$variablename = "test";
在检查阵列之前,请执行以下操作:
if(!is_array($memcachedConfig))
$memcachedConfig = array();
您正在尝试访问一个数组,其键是 . 不会明白这一点。在代码中,我们可以看到问题: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.
深入了解
让我们看看那个错误:
警告:非法字符串偏移量“端口”...
它说了什么?它说我们正在尝试使用字符串作为字符串的偏移量。喜欢这个:'port'
$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
array
可以做些什么?
如果我们知道我们应该有一个 ,我们应该做一些基本的调试来确定为什么我们没有 .如果我们不知道我们是否会有一个 or ,事情就会变得有点棘手。array
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
就我而言,我mysql_fetch_assoc更改为mysql_fetch_array和解决。需要 3 天才能解决:-(而我的 proyect 的其他版本则使用 fetch assoc 运行。
这里有很多很好的答案 - 但我发现我的问题要简单得多。
我正在尝试运行以下命令:
$x['name'] = $j['name'];
我收到这个错误是因为我没有先定义数组。因此,在尝试将内容分配给之前,我将以下代码行放入:illegal string
$x['name']
$x[]
$x = array();
它奏效了。
评论
从 PHP 5.4 开始,我们需要传递函数期望的相同数据类型值。例如:
function testimonial($id); // This function expects $id as an integer
调用此函数时,如果提供如下字符串值:
$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning
由于数据类型不匹配,这将生成非法偏移警告。为了解决这个问题,你可以使用 settype
:
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
评论
以防万一它对任何人都有帮助,我收到此错误是因为我忘记取消序列化数组。这绝对是我要检查的,如果它适用于你的情况。
这是一个旧的,但以防有人可以从中受益。 如果您的数组为空,您也会收到此错误。
就我而言,我有:
$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
这个问题有点晚了,但对于其他正在搜索的人:我通过使用错误的值(类型)初始化而出现此错误:
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
正确的方法是:
$varName = array();
$varName["x"] = "test"; // works
评论
它对我有用:
我的测试代码:
$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{
$test = $result['c'];
}
print_r($test);
输出:55
检查一下,伙计们。谢谢
只需使用
$memcachedConfig = array();
以前
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ....
这是因为您从未定义过$memcachedConfig的内容,因此默认情况下由字符串而不是数组处理。
我通过使用 trim() 函数解决了这个问题。问题出在空间上。
所以让我们试试吧
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
我希望这对你有所帮助。
我认为此消息的唯一原因是因为目标数组实际上是一个数组,例如字符串等(JSON -> {“host”: “127.0.0.1”})变量
对于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']);
}
只需确保检查返回的值是否为空即可。 所以这个例子是针对PHP的,所以找出如何检查一个数组在其他语言中是否为空。
就我而言:在获取数据库记录时,请确保使用而不是或result_array();
row();
row_array();
评论
$memcachedConfig
var_dump($memcachedConfig);
var_export($memcachedConfig)