【问题标题】:Cannot use string offset as an array breaks in php5.2, not in php5.4不能在 php5.2 中使用字符串偏移作为数组中断,而不是在 php5.4
【发布时间】:2013-10-04 10:30:17
【问题描述】:

我遇到了 php 的这个问题,我想最糟糕的部分是它在我的开发环境 (php v5.4) 上运行良好,但在网络服务器上的测试/实时站点上中断 (php v5.2) .

所以当我 var_dump 我的 $_POST["formData"] 时,我得到一个如下所示的数组:

array(42) {
    [0] => array(2) {
        ["name"] => string(2) "id";
        ["value"] => string(4) "3972";
    }
    [1] => array(2) {
        ["name"] => string(2) "action";
        ["value"] => string(4) "edit";
    }
...
}

为了分开这个,我使用这个(或这个的一些变体):

for($i=0;$i<count($_POST["formData"]);$i++) {
    $data[$_POST["formData"][$i]["name"]] = $_POST["formData"][$i]["value"];
}

所以我最终能够通过以下方式访问所有内容:

foreach($data as $key => $value) {
    echo $key . " = " . $value . "<br />";
}

哪个输出:

id = 3972
action = edit
...

所以,同样,这在我的开发服务器上运行良好,但在实时站点上中断。我在这里环顾四周,发现了很多示例,但似乎其中很多使用的示例并不完全相同。

这是什么原因造成的?是不是有些设定?这两个版本之间有变化吗?我尝试了其他几件事,但都没有奏效,而且在测试服务器上进行测试有点痛苦(一次上传一个文件......耶......)。任何简单的解决方案还是我必须重建我的脚本?

【问题讨论】:

  • 它是如何“破解”的?你有错误吗?对于 PHP 5.2,它在语法上没有任何问题。您不使用特定于 5.4 的语法,例如数组取消引用 function_call()['key']...
  • 是的,我收到“不能将字符串偏移量用作数组”错误

标签: php arrays


【解决方案1】:

该错误表明您正在使用字符串,就好像它是一个数组一样。我假设这是您的 for 循环。我不完全确定,但 $data 可能被隐式初始化为一个空字符串,然后您尝试取消引用并分配给它。像这样重写有帮助吗?

$data = array();    
foreach($_POST['formData'] as $kvp) {
    $data[$kvp['name']] = $kvp['value'];
}

这段代码也更快,因为你没有在循环中调用count()

【讨论】:

  • 重新配置了它,它仍然可以在开发服务器上工作,但不能在测试服务器上。
  • 好吧,这导致了另一个错误:为 foreach() 提供的参数无效
  • 哈哈,抱歉,尝试掉线,但没有按 shift 为 foreach() 提供的参数无效
  • 好的。 $_POST['formData'] 不是数组。 var_dump($_POST['formData']); 的输出是什么?我很确定这不会是你的问题......
  • 我刚刚检查过,该死的测试/实时服务器正在输出一个字符串!这就是问题所在。
【解决方案2】:

事实证明,这确实是 PHP 版本之间的差异,如demonstrated by this handy comparison tool

作为参考,有些令人困惑的错误来自以下两个步骤(在 PHP 5.4 之前):

  1. 您获取一个您认为是数组但实际上是字符串的变量,然后访问它的“元素”,例如$foo[1]$foo['bar']。 PHP 将其理解为“获取字符串的第 N 个字符”——$foo[1] 表示$foo 的第二个字符,$foo['bar'] 表示第一个字符,因为bar 被转换为0
  2. 然后您可以访问 that,就好像它是一个数组一样。较新版本的 PHP 只是对您最终得到的 1 个字符的字符串重复第 1 步,但直到 PHP 5.4 这导致了丑陋的错误。

所以在某些情况下,您的$_POST["formData"] 不是一个数组,而是一个字符串。这可能有时在两种环境中都会发生,但错误处理的区别在于在一种环境中屏蔽它,而不是在另一种环境中。

【讨论】:

  • 其实只是想通了(我需要给自己买一只橡皮鸭)。我的开发环境是使用 serialize() 对 formData 进行 AJAX,测试/实时服务器仍然使用 serializeArray() 对其进行 AJAX,这导致将数据解释为字符串而不是数组。
  • 好吧,无论如何,我通过研究这个学到了一些东西,因为我以前不知道 5.4 中的那个变化。这个答案的变化有一个解释:stackoverflow.com/a/6588806/157957
  • 是的,我正在阅读一堆关于该错误的帖子,这就是为什么我什至费心发布这个;这对我来说没有意义,因为我的脚本实际上在他们说它不应该工作的地方工作。它并没有被掩盖,因为我现在没有鼠标,所以在这个疯狂的 8pt 字体或任何显示的东西上添加错误报告和在触控板上滚动结果是很痛苦的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多