比较pdo查询结果的最佳方法

时间:2013-08-23 03:28:37

标签: php pdo

我有以下代码可以工作并执行我想要的但我觉得我使用的代码比必要的多。我想要做的就是获取数据库单元格中的值并检查它是否为“1”,如果是,则运行另一个查询。

$isComplete = $database -> prepare("SELECT completed FROM projects WHERE id = $project_id");
$isComplete -> execute();
$result = $isComplete -> fetchAll();
$result = count($result);
if($result == 1) { $database -> exec("UPDATE projects SET num_complete = num_complete - 1 WHERE id = $parent_id"); }

3 个答案:

答案 0 :(得分:0)

首先,从代码的角度来看,您的代码确实不是最优的 这也与您自己的描述相矛盾

而且 - 更糟糕的是 - 它很容易被SQL注入。

此外,您的变量命名不一致且令人困惑 以下是检查所选值是否为1的正确代码。

$stmt = $database->prepare("SELECT completed FROM projects WHERE id = ?");
$stmt->execute(array($project_id));
$isComplete = $stmt->fetchColumn();
if ($isComplete) ...

但是,我怀疑你需要这样的代码。获取已完成的子任务数是一个简单查询的问题。你真的确定你需要这个num_complete字段吗?

答案 1 :(得分:0)

而不是WHERE子句中的子查询,您可以在JOIN子句中放置一个子查询,以绕过MySQL在UPDATE和子查询中定位表的限制。此外,您可以在SQL查询中执行计算,而不是选择具有给定项目ID的所有行并在PHP中对其进行计数。类似的东西:

UPDATE projects p0
    JOIN (SELECT id, count(*) AS nSiblings
            FROM projects
            WHERE id=:project GROUP BY id)
         AS p1
      ON p0.id=p1.id
  SET p0.num_complete=p0.num_complete+1
  WHERE p1.nSiblings=1

请注意,由于它是内部联接,因此在子查询中指定ID就足够了。您也可以删除GROUP BY id,但是如果您将该语句用于其他用途,则可能会引入错误。

表格设计可能存在影响此查询(以及其他方面)的其他问题,但由于未提供架构,因此无法提供反馈。

答案 2 :(得分:-1)

您可以使用子查询来检查update语句中的条件。像这样:

UPDATE projects SET num_complete = num_complete - 1 WHERE id = $parent_id
and (select completed from projects where id = $project_id) = 1

例如:

$st = $database->prepare("UPDATE projects SET num_complete = num_complete - 1 WHERE id = :parent_id
    and (select completed from projects where id = :project_id) = 1");
$st->bindParam(':parent_id', $parent_id, PDO::PARAM_INT);
$st->bindParam(':project_id', $project_id, PDO::PARAM_INT);
$st->execute();