mysql vs mysqli的结果不一样?

时间:2013-01-04 08:02:29

标签: php mysql mysqli

我有这个旧的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

我做错了什么?

请提前帮助和感谢: - )

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

您的mysql_xxx()代码和mysqli_xx()代码都没有检查错误。

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

在这种情况下,很明显发生了什么:原始mysql_query()正在运行,但mysqli_query()正在抛出错误。在没有错误处理程序的情况下,程序正在逐渐获取num行(由于错误而为false),添加1,最终结果为1.

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

这里的代码不足以确定,但两个代码片段之间的明显区别是引入了$connect变量。

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

我的猜测是,虽然您正在传递$connect,但实际上并未填充连接变量。我能想到的最可能的原因是,如果连接是在程序的另一部分中进行的,并且您没有将$connect传递给此函数。

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