1

我有这个旧的 mysql 查询:

$sql = mysql_query("SELECT id FROM nf_users 
    WHERE points > 
        (SELECT points FROM nf_users WHERE id = 1) 
    AND played > 0");
$row = mysql_fetch_array($sql);

$rank = mysql_num_rows($sql)+1;

这给出了$rank的值2578。现在,如果我尝试像这样对 mysqli 做同样的事情:

$sql = mysqli_query($connect,"SELECT id FROM nf_users 
    WHERE points > 
        (SELECT points FROM nf_users WHERE id = 1) 
    AND played > 0");
$row = mysqli_fetch_array($sql);

$rank = mysqli_num_rows($sql)+1;

现在$rank只说1

我究竟做错了什么?

请提前帮助和感谢:-)

4

2 回答 2

3

好吧,除了最有可能由简单的错字引起的 num_rows 问题之外,还有更重要的事情要提一下:

选择行而不是它们的计数是一种非常糟糕的做法,这会给您的应用程序带来不必要的负载。始终要求您的数据库进行计数,而不是 API

$sql = "SELECT count(*) FROM nf_users 
        WHERE points > (SELECT points FROM nf_users WHERE id = 1) 
        AND played > 0";
$res  = mysqli_query($connect,$sql) or trigger_error(mysqli_error($connect)." [$sql]");
$row  = mysqli_fetch_row($res);
$rank = $row[0]+1;
于 2013-01-04T08:27:13.203 回答
3

您的mysql_xxx()代码和您的mysqli_xx()代码都不会检查错误。

这是你的根本错误。优雅地处理错误和意外事件是编写健壮代码的关键之一。

在这种情况下,很清楚发生了什么:原来mysql_query()的工作正常,但mysqli_query()抛出错误。在没有错误处理程序的情况下,程序正在获取 num 行(这是false由于错误),加 1,最终结果为 1。

这一点很清楚。所以问题不是“发生了什么”,而是“为什么”?

这里没有足够的代码可以确定,但是两个代码片段之间的明显区别在于$connect变量的引入。

正如您显然已经知道的那样,这些mysqli函数要求您传递连接对象,而旧mysql函数不需要(如果您不传递它,它们默认为隐藏的全局连接 - 这是导致的设计缺陷之一旧的mysql扩展被认为不好使用)。

我的猜测是,尽管您正在传递$connect,但实际上并未填充连接变量。我能想到的最可能的原因是,如果连接是在程序的另一部分建立的,而您还没有传递$connect给这个函数。

但是,如果您添加一些错误处理,这将变得清晰。

于 2013-01-04T09:15:50.510 回答