MySQLI计数错误

时间:2013-06-20 16:51:17

标签: php mysqli

我有两个不同的功能:

function user_count(){
    global $db;
    $query = mysqli_query($db,"SELECT COUNT(user_id) FROM users");
    if($result = $query){
         $user_count = mysqli_num_rows($result);
         mysqli_free_result($result);
         return $user_count;
     }
}

在这个函数中,我查询数据库告诉我有多少用户,在PHP中我使用user_count()。这个函数的结果是1.哪个是正确的,因为我目前在数据库中只有1个用户。 但是当我对不同的函数使用相同的代码时,例如:

function user_exists($username){
    global $db;
    sanitize($username);
    $query = mysqli_query($db,"SELECT COUNT(user_id) FROM users WHERE username=".$username) or die ("Doesn't work");
    if($result = $query){
        $user_exists = mysqli_num_rows($result);
        mysqli_free_result($result);
        return $user_exists;
    }
}

更不用说我也试图注释掉sanitize($ username)。但即使它被注释掉,我仍然会收到错误。

我使用函数user_exists(“superadmin”),我收到错误“不工作”。我想知道我在第二个函数中做错了什么,第一个函数会返回行数,而第二个函数会返回错误。

我确实知道:

  1. 数据库正在连接
  2. 字符串清理正在运行
  3. 用户确实存在于数据库中
  4. 如果您使用程序样式回复,我将非常感激。

3 个答案:

答案 0 :(得分:1)

用一个聪明人的话来说,“这不是你要找的伯爵”

mysqli_num_rows将返回结果集中的行数,在这种情况下,它将始终为1.

要获得实际点数,您必须使用$row=mysqli_fetch_row($result),然后您想要的点数在$row[0];

此外,您没有正确创建查询 - 查询应该在变量周围有单引号。更好的是,看看使用准备好的陈述,因为他们会照顾你所有的逃避和报价

答案 1 :(得分:0)

您要求表用户中的user_ids数量,因此MySQL服务器将返回如下内容:

mysql> SELECT COUNT(user_id) FROM users;
+----------+
| count(*) |
+----------+
|       36 |
+----------+
1 row in set (0.00 sec)

然后,您正在使用mysqli_num_rows检查查询结果以查看返回的行数。但是,正如您所看到的那样,“设置中有1行” - 因此您将在查询结果中找回行的行数的数量user_ids。

你想要做的是这样的事情:

$row = mysqli_fetch_row($result);
$num_user_ids = $row[0];

因为$ row [0]包含行中的第一个字段,在我的示例中为36。

关于第二部分,你需要bind parameters,如下所示:

$stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

这意味着你要更换?在上面的第一行中有一个字符串,在第二个参数中给出。

你也可以做你做的事情,但是你必须用单引号括住$username,因为查询不会为你做。

答案 2 :(得分:0)

您只在第一个函数中从mysqli_num_rows获取一行,因为结果集中只有一行(其中包含COUNT值的行)。如果要获取实际读取结果集所需的值。或者,您无法在第一种情况下使用COUNT函数,然后使用mysqli_num_rows

在第二个函数中,我的猜测是你需要在你要搜索的用户名值周围添加单引号。您应该查看从查询返回的实际错误,并从中开始工作。