2011-08-28 143 views
1

我正在尝试为使用PHP和MySQL的客户端创建类注册系统。我已经建立了数据库和表格,并且该部分工作得很好,但是,客户要求在注册后,如果有3名或更少的学生注册以警告该类别可能无法运行。PHP/MySQL Count()问题

我正在尝试使用count()函数以及从注册PHP脚本中设置的cookie中传递动态变量。不过,我遇到了障碍。我似乎无法得到count()函数来实际计数行。我的选择声明如下。任何帮助将不胜感激。

$class = $_COOKIE["class"]; 

$min_check = "SELECT class_list, COUNT(class_list) as count 
       FROM T_Student WHERE class_list = '$class' 
       GROUP BY class_list 
       HAVING count < 20"; 
$result = mysql_query($min_check); 
$count = mysql_num_rows($result); 

if ($count < 4) 
{ 
    echo "IF THERE ARE 3 OR FEWER PEOPLE SIGNED UP FOR THIS CLASS, IT MAY NOT RUN.\n"; 
    echo "THERE ARE CURRENTLY " . $count . " PEOPLE SIGNED UP.\n"; 
} 
else if ($count > 4) 
{ 
    echo "There are currently " . $count . " people signed up for this class."; 
} 
?> 
+0

您不需要同时使用MySQL的'COUNT()'过程和PHP的'mysql_num_rows()';使用一个或另一个。另外,'echo $ count'是什么给你的? – Bojangles

+0

您应该更加小心地命名变量。你用变量和字段名称做了三件不同的事情,你们都称之为数字。使用像count_classes或$ count_rows之类的更具描述性的内容来避免令人眼花缭乱。 – ty812

回答

0

我不推荐使用已知的MySQL标识符,如count。这很混乱。

$class = mysql_real_escape_string($_COOKIE["class"]); 

$min_check = "SELECT class_list, COUNT(class_list) as mycount 
      FROM T_Student WHERE class_list = '$class' 
      GROUP BY class_list 
      HAVING mycount < 20"; 

不要忘记逃离该cookie的内容!

错误是 count是保留字。你需要用反引号或者更好的方式来包围它,使用不同的名字。 本身并不是一个错误,但它太混乱了。

接下来,您并未实际检索数据库中的mycount结果。我建议使用代码是这样的:

$result = mysql_query($min_check); 
while($row = mysql_fetch_assoc($result)) { 
    $people_count = $row['mycount']; 
    if ($people_count < 4) { echo "this" } 
    else { echo "that" } 
} 
+0

事实上不正确。 “内置函数的名称可以作为标识符使用,但可能需要谨慎使用,例如COUNT可以作为列名接受。”(从MYSQL文档的第8.3章 – ty812

+1

Count可以像这样不加引号使用)。尝试一下,看看。非常真实的逃脱虽然:) –

+0

@Martin,谢谢你清理。 – Johan

5

你的SQL查询返回class_list值的列表,每个特定实例的计数,其中有注册的不到20人相处。

$count = mysql_num_rows($result); 

......越来越的结果集,而不是别名count值,这就是为什么你没有看到你所期望的输出返回的记录数。您需要读取结果集以获取值:

while ($row = mysql_fetch_assoc($result)) { 
    $count = $row['count']; 

    if($count < 4) { ... } 
} 
+0

感谢所有的输入。我知道我需要添加一些非常容易的东西,只是一直在考虑它太长的时间才能发现。 – jbrown574

0

您希望的计数返回查询的行中。 mysql_num_rows将计算返回的行数,这不是你想要的。改用它。

$result = mysql_query($min_check); 
$count = mysql_fetch_row($result); 
$count = $count[0]; 
0

乍一看,HAVING count < 20是不必要的。

您使用MySQL计数函数,但从不检索它的值!?使用:

$firstRow = mysql_fetch_row($result); 
$count = $firstRow[1]; // 1 indicates the second column (0 being the first)