使用PHP mysqli行时的奇怪行为

时间:2013-01-02 21:59:05

标签: php arrays mysqli

我目前正在将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];

4 个答案:

答案 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。你应该得到一个错误:

  

解析错误:语法错误,意外'[',期待','或';'在......

Notes

答案 2 :(得分:0)

正如您在PHP.net的release notes中所看到的

functionname()[1]是PHP 5.4中添加的内容。

答案 3 :(得分:0)

不可能在PHP 5.3及更高版本中直接取消引用函数调用的结果,但从PHP 5.4开始就可以