1

我遇到了 php 的这个问题,我想最糟糕的部分是它在我的开发环境(php v5.4)上运行良好,但在 web 服务器上的测试/实时站点(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
...

所以,再次,这在我的开发服务器上工作得很好,但在现场站点上中断了。我在这里环顾四周,发现了很多示例,但似乎其中很多使用的示例并不完全相同。

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

4

2 回答 2

2

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

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

此代码也更快,因为您没有count()在循环中调用。

于 2013-09-28T02:06:56.820 回答
1

事实证明,这确实是 PHP 版本之间的差异,正如这个方便的比较工具所证明的那样

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

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

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

于 2013-09-28T02:20:44.087 回答