我目前正在将PHP脚本从版本5.4的PHP服务器翻译成版本为5.3的PHP服务器
我立即注意到我们的登录脚本中出现了一种奇怪的行为。
在分析了一下脚本之后,我找到了问题的根源。
对$ result-> fetch_row中第一行成员的调用是invaild。
$ result的声明如下所示:
$username = $mysqli->real_escape_string(strtolower($_POST["USERNAME"]));
$password = $mysqli->real_escape_string(md5(strtolower($_POST["PASSWORD"])));
$result = $mysqli->query("SELECT * FROM $table WHERE username='$username' AND password='$password'");
我本能地检查了我是否正确调用了data_seek;我有。
打印出fetch_row()函数给了我以下结果
数组([0] => 3 [1] => admin [2] => d76362b0f640fbcf869033b5e4d1c4bf [3] => Mr [4] => Rasmus [5] => 4 [6] => [7] => 0)
因此阵列正在运作。
但以下声明无效。
$ Title = $ result-> fetch_row()[3];
因此,我尝试将整行存储在单个数组对象中,然后单独调用所有子成员。
像这样:
$row = $result->fetch_row();
$Title = $row[3];
它完美无缺。
怎么样?这个声明有什么问题:
$ Title = $ result-> fetch_row()[3];
答案 0 :(得分:4)
在PHP 5.4中引入了直接从调用方法引用返回数组元素的能力 - 这就是它在5.3中不起作用的原因。
http://php.net/manual/en/language.types.array.php
上的示例#7从PHP 5.4开始,可以对a的结果进行数组解除引用 函数或方法直接调用。之前它只能使用一个 临时变量。
所以你的临时解决方案看起来会变成一个长期解决方案:)
答案 1 :(得分:3)
你说你正在将脚本从PHP 5.4翻译成PHP 5.3。显然你忘了那条线,因为
$Title = $result->fetch_row()[3];
无效PHP 5.3。你应该得到一个错误:
解析错误:语法错误,意外'[',期待','或';'在......
答案 2 :(得分:0)
正如您在PHP.net的release notes中所看到的
functionname()[1]
是PHP 5.4中添加的内容。
答案 3 :(得分:0)
不可能在PHP 5.3及更高版本中直接取消引用函数调用的结果,但从PHP 5.4开始就可以