0

次のコードは機能し、必要なことを実行しますが、必要以上のコードを使用していると感じています。私がしたいのは、データベースセルの値を取得し、それが「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"); }
4

3 に答える 3

0

WHERE節のサブクエリの代わりに、サブクエリを節に入れることで、サブクエリとサブクエリJOINの両方でテーブルをターゲットにすることに対する MySQL の制限を回避できますUPDATE。また、特定のプロジェクト ID を持つすべての行を選択して PHP でカウントする代わりに、SQL クエリで計算を実行できます。何かのようなもの:

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、ステートメントを別の用途に適合させると、バグが発生する可能性があります。

このクエリ (およびその他の側面) に影響を与えるテーブル設計に関する他の問題がある可能性がありますが、スキーマが提供されていないため、フィードバックを提供する方法はありません。

于 2013-08-23T21:55:28.877 に答える
0

まず、コードの量の観点から、コードは実際には最適ではありません。
それはあなた自身の説明とも矛盾しています

さらに悪いことに、SQL インジェクションが発生しやすくなります。

また、変数の命名に一貫性がなく、混乱しています。
選択した値 = 1 かどうかを確認する適切なコードを次に示します。

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

ただし、そのようなコードが必要であるとは思えません。完了したサブタスクの数を取得するには、1 つの単純なクエリが必要です。num_complete本当にこのフィールドが必要ですか?

于 2013-08-23T07:01:07.853 に答える