【问题标题】:Weird behaviour when using PHP mysqli row使用 PHP mysqli 行时的奇怪行为
【发布时间】:2012-12-17 06:46:51
【问题描述】:

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

【问题讨论】:

  • 哪句话有误?
  • 抱歉,这是一个糟糕的表述。刚刚更正了。

标签: php arrays mysqli


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您说您正在将脚本从 PHP 5.4 翻译到 PHP 5.3。显然你忘记了那行,因为

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

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

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

    Notes

    【讨论】:

    • 您说得对。我刚开始编写 PHP 脚本,而我之前是用 C# 编程的。这是第一次用 PHP 5.3 编写 - 我很抱歉给您带来的麻烦。
    • 完全没有问题。此类问题并不少见。如果我找到了更新日志,我会提供一个链接。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2014-07-08
        • 2013-08-09
        • 2021-11-21
        • 2018-05-20
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多