2014-03-31 74 views
0

我一直在使用这个命令来检索具有相同的电子邮件地址字段的号码:问题与SELECT COUNT(ID)

$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error); 

有3条记录users表相同的电子邮件地址。问题是当我把*而不是COUNT(user_id)它正确地返回:$query->num_rows给3,但是当我使用COUNT(user_id)然后$query->num_rows时,返回1。我该如何纠正这个问题或我的问题在哪里?

+2

可以将user_id设置为NULL吗? – Alfons

+0

你有没有试过'COUNT(*)'? – aurbano

+1

@Chevi我认为它也被提及:-) – ponciste

回答

-1

这是正确的行为:如果使用COUNT函数,则选择查询的结果将只是一行,其中一列包含数据集的数量。

所以,你可以检索用户与给定的E-mail地址这样的数字:

$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,因为它并不需要更快实际获取数据。

+0

谢谢。那是对的。我正在寻找一个相同的号码。虽然我没有明白你的观点,但由于你的建议,我开始研究一些功能,以真正了解他们基本的工作原理和原理。我花了3个小时才知道你在说什么,但现在我明白了。它只返回一行。我用fetch_row()获取行,然后查看第一个索引值[0]。价值3完全符合我的期望。 – EhsanSia

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()会忽略它们。

0
  1. 电子邮件必须是用户表中的uinque。因此,你根本不需要计数。
  2. 你应该使用预处理语句。
  3. 你不应该发布永远不会运行的代码。

这里去运行这样一个查询的唯一正确途径。

$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变量中,您将在下面的代码中使用您需要的userdata或false,这意味着找不到用户。因此$user可以在if()声明中使用,不需要任何计数。

如果您确实需要对行进行计数,则使用您尝试使用的count()方法。您可以使用this answer中的函数:

$count = getVar("SELECT COUNT(1) FROM users WHERE salary > ?", $salary); 
+0

我假设你低估了我们的答案 –

+0

如果他的'email'字段(由于某种原因)不是唯一的,为什么他不应该计算他所重复的电子邮件的数量? – aurbano

+0

@Chevi这样的一个原因只是不退出。用户表显然必须是唯一的。无论哪种方式,你必须质疑操作,而不是我。 –