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()
将