1

我目前正在将 PHP 脚本从 5.4 版本的 PHP 服务器转换为 5.3 版本的 PHP 服务器

我立即注意到我们的登录脚本中有一个奇怪的行为。

在对脚本进行了一番分析之后,我找到了问题的根源。

对 $result->fetch_row 中第一行成员的调用无效。

$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

4 回答 4

4

PHP 5.4 中引入了直接从调用方法中引用返回数组元素的能力——这就是它在 5.3 中不起作用的原因。

来自http://php.net/manual/en/language.types.array.php上的示例 #7

从 PHP 5.4 开始,可以直接对函数或方法调用的结果进行数组取消引用。以前只能使用临时变量。

因此,您的临时解决方案看起来将成为长期解决方案:)

于 2013-01-02T22:10:29.140 回答
3

您说您正在将脚本从 PHP 5.4 转换为 PHP 5.3。显然你忘记了那条线,因为

$Title = $result->fetch_row()[3];

不是有效的 PHP 5.3。你应该得到一个错误读数:

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

笔记

于 2013-01-02T22:04:21.853 回答
0

如您在PHP.net的发行说明中所见

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

于 2013-01-02T22:05:29.953 回答
0

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

于 2013-01-02T22:09:00.580 回答