Я создал две таблицы, простые компоненты и комментарии , и связал их с INNER JOIN
.
Я присоединился к ним успешно, однако мне трудно удалить из объединенной таблицы.
Я хочу сделать так:
Если есть последняя строка комментария, называемая –let, скажем A, – то удалите как его комментарии, так и сам A из таблицы.
Else, если A прокомментировал много раз, с разными комментариями, удалит его / ее комментарии, но пусть его / ее личная информация останется, так как у A есть другие комментарии.
Вот как я это сделал:
if (!empty($_POST["delete"])) { foreach ($_POST["delete"] as $key => $value) { $resultid = $conn->query("SELECT commentorid FROM `simplecomments` WHERE id=".$value); $rowid = $resultid->fetch_assoc(); $outputdelete = $rowid["name"] . " has been deleted" . "<br>"; $deletedname = $deletedname.$outputdelete; $RES = mysql_num_rows($resultid); $counter = 0; while($row = $RES) { //IF IT'S LAST ROW, DELETE COMMENTOR AND HIS/HER COMMENTDETAILS if(++$counter == $results) { $resultid = $conn->query("DELETE FROM `commentor`"); } //ELSE JUST DELETE HIS/HER COMMENTDETAILS, LET HIS/HER INFO REMAIN else{ $resultid = $conn->query("DELETE FROM `simplecomments` WHERE id=".$value); } } } }
Однако код не будет работать. Я получаю сообщение об ошибке:
Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом [..] …
Рассмотрите возможность запуска DELETE...INNER JOIN
и DELETE
с помощью условий подзапроса и избегайте циклического извлечения PHP-запроса с if/else
поскольку логика выглядит следующим образом:
И да, все три DELETE
могут быть запущены одновременно во всех идентификаторах, поскольку взаимно исключающие условия помещаются между первыми двумя и последними. Следовательно, либо первые два затрагивают строки, либо последние влияют на строки на итерацию. Незатронутый (-ые) человек удалит нулевые строки из любой таблицы.
Кроме того, записи simplecomments удаляются сначала, так как эта таблица может иметь ограничение внешнего ключа с комментарием из-за его отношения «один ко многим». Наконец, ниже предполагается, что идентификаторы комментариев передаются в цикл (а не идентификатор комментария ).
PHP (с использованием параметризации, предполагая, что $ conn является объектом соединения 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(); }
В качестве альтернативы, для подхода DRY-er, выполняйте инструкции SQL в массиве:
$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(); } }