我一直在使用此命令检索具有相同电子邮件地址的字段数:
$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error);
users
表中有3条记录具有相同的电子邮件地址。问题是当我把*而不是COUNT(user_id)
正确地返回时:$query->num_rows
给出3但是当我使用COUNT(user_id)
时,$query->num_rows
会一直返回1。我怎样才能纠正这个或者我的问题在哪里?
答案 0 :(得分:0)
当您对该查询使用$query->num_rows
时,它将仅返回1行,因为只返回一个计数。
实际行数将包含在该查询中。如果要将结果作为对象,或关联数组为计数指定名称:
$query = $db->query("SELECT COUNT(`user_id`) AS total FROM `users` WHERE `email`='$email'") or die($db-error);
在返回的查询total
中应该是3,而$query->num_rows
仍然是1.如果您只想快速使用$total = $query->fetchColumn();
这个值。
正如其他人所说的那样,请注意NULL
用户ID,因为COUNT()
会忽略它们。
答案 1 :(得分:0)
这是运行此类查询的唯一正确方法:
$sql = "SELECT * FROM `users` WHERE `email`=?";
$stm = $db->prepare($sql);
$stm->execute([$email]);
$user = $stm-fetch();
(代码是由于错误的标记而编写的。对于mysqli,您将需要另一个代码,但指南保持不变。)
像这样的东西
$sql = "SELECT * FROM `users` WHERE `email`=?";
$stm = $db->prepare($sql);
$stm->bind_param('s',$email);
$stm->execute();
$res = $stm->get_result()
$user = $res->fetch_assoc();
在$user
变量中,您将拥有以下代码中需要的用户数据或false
,这意味着找不到用户。因此,$user
可以在if()
语句中使用,无需任何计数。
如果您确实需要计算行数,那么您可以使用此尝试的count()方法。您可以使用this answer中的函数:
$count = getVar("SELECT COUNT(1) FROM users WHERE salary > ?", $salary);
答案 2 :(得分:-1)
这是正确的行为:如果使用COUNT
函数,则select查询的结果只是一行,其中一列包含数据集的数量。
因此,您可以检索具有给定电子邮件地址的用户数量,如下所示:
$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error);
$row = $query->fetch_row();
$count = $row[0];
请注意,这比使用SELECT *
查询所有数据并检查$query->num_rows
要快,因为它不需要实际获取数据。