【问题标题】:Is there a way to replicate mysql_result using mysqli (procedural)? [duplicate]有没有办法使用 mysqli(程序)复制 mysql_result? [复制]
【发布时间】:2014-01-03 09:20:20
【问题描述】:

我用的是mysqli而不是mysql,遇到了错误Call to undefined function mysqli_result()

从谷歌上看,普遍的共识是 mysql_result 无论如何都是一个无用的函数,并且在 MySQLi 库中不需要它。不过我觉得还是有用的,看不出下面的代码有什么问题?

do
{
    $id = rand_id();
    $exists = mysql_query('SELECT EXISTS(SELECT 1 FROM `files` WHERE `name` = "' . $id . '")');
}
while (mysql_result($exists, 0) === 1);

有没有一种方法可以复制 mysql_result 的工作方式而无需过多更改代码?

【问题讨论】:

  • 这不是一个问题,这是一个辩论话题。
  • 你是对的。我已经编辑过了
  • 对不起,伙计们,以前应该找到的。我已将其标记为重复。谢谢
  • PHP 标签下的一些问题让我发疯。 “如何使用一些不好的做法来让糟糕的代码工作?”
  • @YourCommonSense SO 上的一些 cmets 让我发疯。 “你的代码很糟糕”,没有解释它有什么不好。

标签: php mysql mysqli


【解决方案1】:

在这种特定情况下,您可以使用:

do {
    $id = rand_id();
    $exists = mysqli_query("SELECT 1 FROM files WHERE name = $id");
} while (mysqli_num_rows($exists));

至于您可能想要使用mysql_result 的其他情况,文档建议:

  • mysqli_data_seek()mysqli_field_seek()mysqli_fetch_field() 结合使用
  • PDOStatement::fetchColumn()

在 PHP 中循环到任意行可能会令人困惑。我认为在查询本身中使用LIMIT/OFFSET 会更有意义。

【讨论】:

    【解决方案2】:

    你可以自己实现,

    function mysqli_result($res, $row, $field=0) { 
        $res->data_seek($row); 
        $datarow = $res->fetch_array(); 
        return $datarow[$field]; 
    }
    

    mysql_result 的受欢迎程度来自只需要访问单个行或字段的人。自 PHP 5.4 起,array dereferencing support 现已添加,因此您可以这样做:

    $result->fetch_assoc()['field'];
    

    所以在你的例子中,你可以这样做

    while ($exists->fetchassoc()[0] === 1);
    

    【讨论】:

    • 谢谢,while (mysqli_fetch_assoc($exists)[0] === 1); 完美运行。
    • mysql_result 唯一的流行来自于上个世纪编写的教程。 @cantsay 你最好学习一些不是旧的实践,而不是尝试将它与新的 API 一起使用
    猜你喜欢
    • 2014-04-03
    • 2012-07-01
    • 2017-12-09
    • 2018-05-27
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多