Overvej at køre DELETE...INNER JOIN
og DELETE
med underforespørgselsbetingelser og undgå PHP-forespørgselshentningslooping med if/else
da logikken ser ud til at være følgende:
- slet enhver kommentators profil og kommentarer, hvis han/hun kun har én kommentar
- slet kun kommentatorens kommentarer, hvis han/hun har flere (dvs. mere end én) kommentarer.
Og ja, alle tre DELETE
kan køres på samme tid på tværs af alle id'er, da gensidigt udelukkende betingelser er placeret mellem de to første og sidste. Derfor påvirker enten de to første rækker eller den sidste rækker pr. iteration. Den eller de upåvirkede vil slette nul rækker fra begge tabeller.
Også simplecomments poster slettes først, da denne tabel kan have en fremmednøgle-begrænsning med kommentor på grund af dets en-til-mange forhold. Endelig antager nedenfor kommentar id'er sendes til loop (ikke kommentator id).
PHP (ved at bruge parameterisering, forudsat at $conn er et mysqli-forbindelsesobjekt)
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();
}
Alternativt, for en DRY-er tilgang, loop SQL-sætninger i et array:
$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();
}
}