Rozważ uruchomienie DELETE...INNER JOIN
i DELETE
z warunkowymi podzapytaniami i unikaj pętli pobierania zapytań PHP za pomocą if/else
ponieważ logika wydaje się być następująca:
- usuń profil i komentarze dowolnego komentatora, jeśli ma tylko jeden komentarz
- usuń tylko komentarze komentującego, jeśli ma on/ona wiele (tj. więcej niż jeden) komentarzy.
I tak, wszystkie trzy DELETE
można uruchomić w tym samym czasie dla wszystkich identyfikatorów, ponieważ wykluczające się warunki znajdują się między pierwszymi dwoma a ostatnimi. W związku z tym albo pierwsze dwa wpływają na wiersze, albo ostatni oddziałują na wiersze na iterację. Nienaruszony(e) usunie zero wierszy z obu tabel.
Ponadto proste komentarze rekordy są usuwane jako pierwsze, ponieważ ta tabela może mieć ograniczenie klucza obcego z komentarzem ze względu na relację jeden-do-wielu. Wreszcie poniżej zakładamy komentarz identyfikatory są przekazywane do pętli (nie do komentarza id).
PHP (używając parametryzacji, zakładając, że $conn jest obiektem połączenia mysqli)
foreach ($_POST["delete"] as $key => $value) {
// DELETE COMMENTS AND THEN PROFILE FOR COMMENTORS WITH ONE POST
$sql = "DELETE FROM `simplecomments` s
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) = 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
$sql = "DELETE c.* FROM `simplecomments` c
INNER JOIN `simplecomments` s ON s.commentorid = c.id
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) = 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
// DELETE COMMENTS FOR COMMENTORS WITH MULTIPLE POSTS BUT KEEP PROFILE
$sql = "DELETE FROM `simplecomments` s
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) > 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
}
Alternatywnie, dla podejścia DRY-er, zapętl instrukcje SQL w tablicy:
$sqls = array(
0 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
1 => "DELETE c.* FROM `simplecomments` c INNER JOIN `simplecomments` s ON s.commentorid = c.id WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
2 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) > 1"
);
foreach ($_POST["delete"] as $key => $value) {
foreach($sqls as $sql) {
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
}
}