PHP - 检查表中的所有条目是否具有值1,然后回显一些

时间:2016-01-10 03:33:39

标签: php mysql

我目前遇到了一个问题。我建立了一个基本的“团队工作平台”,您可以在其中设置待办事项列表中的任务。通过将done的值设置为1

,我已经实现了可以将任务标记为完成的功能

我需要能够检查列表中的所有任务是否都设置为完成,如果是,则回显一下。我的代码检查值1,但它确定单个条目设置为1.但我需要它来检查所有任务是否具有值1,如果他们这样做,它应该回应一些东西。

$res3 = mysql_query("SELECT * FROM tasks WHERE tasks.planet_id=1 AND        team_id=$teamid AND done=1") 
or die(mysql_error()); 
if ($res3 && mysql_num_rows($res3) > 0)
{
    echo 'Complete!'; 
}
else
{
echo 'Not done yet!';
}

我将尝试举例说明我希望它如何工作:让我说我在表中有10个任务。我希望代码能够识别这些任务中的所有10个是否已使用值1设置标记为完成。然后回声“你的所有任务都已完成”。因此,它需要以某种方式遍历表中的所有条目,并检查它们是否都设置为1,当它们都设置为1时,它回显了一些东西。

请帮忙! :)

3 个答案:

答案 0 :(得分:0)

假设done是一个整数,可以是0或1,你可以这样做:

SELECT COUNT(*) total, SUM(done) totalDone FROM tasks WHERE tasks.planet_id=1 AND team_id=$teamid;

然后在PHP代码中测试total == totalDone。

或者,如果确实想要在total == totalDone(例如您的评论建议)时只从数据库中获取一行,您可以写下这样的内容:

SELECT * FROM (SELECT COUNT(*) total, SUM(done) totalDone FROM tasks WHERE tasks.planet_id=1 AND team_id=$teamid) _X WHERE _X.total = _X.totalDone;

但这只是增加了许多额外的复杂性而没有真正的收获,我不建议这样做。

请注意,您在新代码中should not use mysql_* functions,而应使用mysqliPDO。不建议将mysql_ *用于新代码。

此外,您应该小心在查询字符串中直接使用变量。这很容易导致sql注入漏洞。 Instead, use parameterized queries with mysqli or PDO.

答案 1 :(得分:0)

“完成所有任务”的答案最好是完成了多少任务的问题<> 1。

SELECT count(*) as 'incomplete'
FROM tasks 
WHERE tasks.planet_id=1
  AND team_id=$teamid and done <> 1;

因此您可以使用代码:

if($res3) {
  $incompleteQueryResult = mysql_fetch_assoc($res3);
  if ($incompleteQueryResult['incomplete'] > 0) {
     echo "Not done yet";
  } else {
     echo "Complete!";
  }
} else {
  echo "Could not retrieve completed tasks";
}

如果您仍然需要检索已完成任务的数量以及未完成的任务数,则可以修改类似于以下内容的查询。

SELECT 
  IF(done = 1, 'complete', 'incomplete') as status,
  COUNT(*) AS 'number_in_status'
FROM tasks 
WHERE tasks.planet_id=1
  AND team_id=$teamid
GROUP BY done

如果是这样,您还需要修改在PHP中检索它的方式。

如果您需要了解上述所有内容,则执行两个查询(一个作为聚合/摘要,一个作为完整数据集)或在变量中跟踪它。 e.g。

$numIncompleteTasks = 0;
while($row = mysql_fetch_assoc($res3)) {
  $numIncompleteTasks += ! (bool) $row['done']; 
}
// you now know how many tasks are incomplete.

您可以修改此代码以跟踪完整和不完整。

弃用通知。

我建议您查看您对mysql_ *函数的使用 - 不推荐使用PHP并在recent versions of PHP中删除这些函数。

答案 2 :(得分:-1)

jbafford的答案在某些情况下不起作用。 让我们假设我们只有三个可能的值:0,1和2.在0 + 1 + 2的情况下,算法会说COUNT = SUM,而实际上我们有{0,1, 2}而不是{1,1,1}。 我为什么这么问?因为我在MYSQL中寻找一种方法来检查它是否全部,并且我排除了COUNT = SUM或者在我的情况下取平均值,因为我的数据中有这个异常。 处理此异常的一种方法是添加COUNT DISTINCT。如果COUNT DISTINCT = 1 COUNT = SUM,则数据集仅为1秒。