Удалите строку с наибольшим идентификатором в mysql, используя php

#php #mysql #database #sql-delete

#php #mysql #База данных #sql-удалить

Вопрос:

Я работаю над действительно простой программой minichat ( php/mysql ), которая отображает последние 10 сообщений.

Я хотел добавить кнопку для удаления последнего сообщения (используя форму, ведущую к php файлу, подобному приведенному ниже).

Я действительно новичок в php and mysql so, я не понимаю, почему это не работает.

Следует моему коду:

 <?php 
    // Create connection
    $cn = new mysqli("localhost","root","","test");

    // Check connection
    if($cn->connect_error)
    {
        echo "Connection failed : " . $cn->connect_error;
    }

    $sql = "DELETE FROM `minichat` WHERE `minichat`.`id` = ('SELECT MAX(`id`) FROM `minichat`')";

    if($cn->query($sql) === TRUE){
            echo "Deleted succesfully";
    }
    else
    {
        echo "Error deleting record: " . $cn->error;
    }

    //header('Location: connexion.php');
?>
 

Комментарии:

1. Что не работает?

2. Покажите нам ошибку или объясните, что не работает

3. Он не удаляет строку и не отправляет никаких ошибок с этим кодом, но отображает «Удалено успешно»

4. Проверьте журналы ошибок.

5. разрешены ли права на удаление? просмотр данного ответа не решил проблему, которую он должен был иметь

Ответ №1:

В соответствии с руководством по синтаксису УДАЛЕНИЯ:

Подзапросы

Вы не можете удалить из таблицы и выбрать из той же таблицы в подзапросе.

Поэтому вместо этого вы должны сделать что-то вроде:

 DELETE FROM minichat ORDER BY id DESC LIMIT 1
 

И вам, вероятно, нужно условие, чтобы убедиться, что пользователь может удалить только свой собственный комментарий..

Комментарии:

1. ах, это имеет большой смысл.

2. Учитывая также, что права на удаление были предоставлены и что «указанная кнопка», которую они хотят использовать, действительно работает 😉 согласно моим комментариям под вопросом.

3. @Fred-ii- я просто предположу, что это так 😉

4. Мне любопытно, почему их запрос вернул TRUE, когда он должен был вернуть FALSE, учитывая, что они проверяют наличие ошибок. Будет ли MySQL работать без сбоев, если разрешения на удаление не были предоставлены? Конечно, я пытаюсь думать вслух. и / или это просто сбой их неизвестной кнопки? Возможно, сообщение об ошибках не используется? Я сбит с толку. Редактировать: О, так они сказали, что это работает. ну, хип-хип-час!

5. Спасибо! Предыдущий синтаксис был тем, что я придумал сам, не зная этих спецификаций. Теперь это работает, и я намного лучше понимаю, как это работает!

Ответ №2:

Вы должны удалить одинарную кавычку вокруг подвыборки

  "DELETE FROM `minichat` WHERE `minichat`.`id` = (SELECT MAX(`id`) FROM `minichat`)"
 

В противном случае у вас есть WHERE minichat . id = ‘текст строки mi’

и для того, что вы можете удалить из подзапроса, вы можете попробовать

  DELETE 
FROM `minichat` 
WHERE `minichat`.`id` = (select t.id from (SELECT MAX(`id`) FROM `minichat`) t)
 

Ожидается, что это превысит предел для удаления с помощью подзапроса

Комментарии:

1. Хороший улов, этого не видел.

2. Это не работает, он выдает тот же результат «Удалено успешно», но фактически не удаляет строку.

Ответ №3:

Вы можете попробовать и настроить переменную, которая собирает нужный вам идентификатор. Затем вы можете ссылаться на эту переменную как на идентификатор, который вы хотите удалить.

Комментарии:

1. нецелесообразно заходить в БД, запрашивать максимальный идентификатор, а затем отправлять другой запрос на удаление.

2. Нужно ли мне использовать подготовленный запрос для этой цели?

3. Да, например: $ x = SELECT MAX( id ) FROM minichat ) «. Для дальнейшего использования, если запрос не работает, откройте свой редактор sql и попробуйте запустить его там, чтобы посмотреть, работает ли он