1

我有两个不同的功能:

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 回答 3

1

套用一个智者的话,“这不是你要找的伯爵”

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

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

此外,您没有正确创建查询 - 查询应该在变量周围有单引号。更好的是,看看使用准备好的语句,因为它们会为你处理所有的转义和引用

于 2013-06-20T16:56:32.190 回答
0

您正在询问表 users 中的 user_ids 的数量,因此 MySQL 服务器将返回如下内容:

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

然后,您使用mysqli_num_rowswhich 检查查询结果以查看返回了多少行。但是,正如您所看到的,“集合中有 1 行” - 所以您得到的是查询结果中的行数,而不是user_id 的数量。

你想要做的是这样的:

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

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

至于第二部分,您需要绑定参数,如下所示:

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

s 表示您要替换 ? 在上面的第一行中带有一个字符串,该字符串在第二个参数中给出。

你也可以做你所做的,但你必须$username用单引号括起来,因为查询不会为你做。

于 2013-06-20T16:57:46.240 回答
0

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

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

于 2013-06-20T17:00:17.127 回答