我有这个旧的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
?
我做错了什么?
请提前帮助和感谢: - )
答案 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
传递给此函数。
但是如果你添加一些错误处理,这将变得清晰。