Php MySQLI计数错误

Php MySQLI计数错误,php,mysqli,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 $use

我有两种不同的功能:

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”)函数时,我得到一个错误“不工作”。我想知道我在第二个函数中做错了什么,第一个函数将返回行数,而第二个函数将返回错误

我确信:

  • 数据库正在连接
  • 字符串消毒正在工作
  • 数据库中不存在用户
  • 如果您能以程序化的方式回复,我将不胜感激。

    用一位智者的话说,“这不是您要找的伯爵”

    mysqli_num_rows
    将返回结果集中的行数,在本例中,该行数始终为1

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

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

    用一个智者的话来说,“这不是您要找的伯爵”

    mysqli_num_rows
    将返回结果集中的行数,在本例中,该行数始终为1

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


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

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

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    然后,使用
    mysqli\u num\u rows
    检查查询结果,查看返回了多少行。但是,正如您所看到的,集合中有“1行”-因此您将返回查询结果中的行数,而不是用户id的数量

    您要做的是这样的:

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    因为$row[0]包含行中的第一个字段,在我的示例中是36

    至于第二部分,你会想,像这样:

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    s的意思是你要替换?在上面的第一行中使用字符串,该字符串在第二个参数中给出


    您也可以这样做,但是您必须用单引号将
    $username
    括起来,因为查询不适合您。

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

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    然后,使用
    mysqli\u num\u rows
    检查查询结果,查看返回了多少行。但是,正如您所看到的,集合中有“1行”-因此您将返回查询结果中的行数,而不是用户id的数量

    您要做的是这样的:

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    因为$row[0]包含行中的第一个字段,在我的示例中是36

    至于第二部分,你会想,像这样:

    mysql> SELECT COUNT(user_id) FROM users;
    +----------+
    | count(*) |
    +----------+
    |       36 |
    +----------+
    1 row in set (0.00 sec)
    
    $row = mysqli_fetch_row($result);
    $num_user_ids = $row[0];
    
    $stmt = $mysqli->prepare("SELECT COUNT(user_id) FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    
    s的意思是你要替换?在上面的第一行中使用字符串,该字符串在第二个参数中给出


    您也可以这样做,但是您必须用单引号将
    $username
    括起来,因为查询不会为您做任何事情。

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


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

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


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

    为什么不试试
    或死(mysqli_error($db))
    ,并从数据库中获取一些关于发生了什么的有用信息?我想这是因为您需要引用正在查询的值。
    sanitize()
    函数中是否引用了
    $username
    ?否则,您的查询将失败
    username='$username'
    $username是一个变量,它是从函数定义传入的,所以这根本不重要。@Daniel嗯,是的,它确实重要。如果
    $username
    中的字符串不包含引号,则查询在语法上无效。这不是一份事先准备好的声明。MySQL不知道它正在从PHP变量中获取值,只知道它正在接收PHP传递给它的SQL字符串。解决这个问题,然后您需要解决这样一个事实,即您的
    COUNT()
    始终只返回一行,因此您的
    mysqli_num_rows()