@alex2pac_vasiliev
Product Designer

PHP + SQL. Как удалить запись из бд?

Есть простая база данных со словами. На странице есть форма: input-text "слово" и select "словарь". Нужно по нажатию на кнопку "удалить" произвести удаление набранного пользователем слова при условии, что пользователь выбрал словарь, в котором это слово есть.
Данные формы летят в php файл, где следующий код:
session_start();
require('../connection1.php');
header('Content-Type: text/html; charset=utf8');

if (isset($_POST['word']) && isset($_POST['vocabulary'])){
    $word = $_POST['word'];
    $vocabulary = $_POST['vocabulary'];

    $stmt = $connection->prepare("SELECT `id` FROM `words` WHERE `word` = ?");
    $stmt->bind_param("i", $word);
    $stmt->execute();
    $result1 = $stmt->get_result();
    $row = mysqli_fetch_array($result1);

    $stmt = $connection->prepare("SELECT `id` FROM `words` WHERE `vocabulary` = ?");
    $stmt->bind_param("i", $vocabulary);
    $stmt->execute();
    $result2 = $stmt->get_result();
    $id = mysqli_fetch_array($result2);

    if ($row === $id){
        $query = "DELETE FROM `words` WHERE `words`.`id` = '$row'";
        $result = mysqli_query($connection,$query) or die("Ошибка: ".mysqli_error($connection));

        if($result){
            $_SESSION['smsq'] = "Слово удалено!";
        }else {
            $_SESSION['fsmsq'] = "Ошибка!";
        }
    } else {
        $_SESSION['fsmsq'] = "Ошибка!";
    }
}

header('Location: ../edit-voc.php')


Что исправить?)) Новичок + ничего не понимаю в stmt, сколько раз использовать и т.д. ...
Или можно по-другому сделать?
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Молодец, что используешь подготовленные выражения, но очень плохо, что не до конца. Подготовленные выражения должны использоваться для ВСЕХ запросов, в которых участвуют переменные.

Плюс использовать в запросе массив $row не имеет ни малейшего смысла.
Также я не уверен что word следует привязывать с типом i а не s
Ну и разумеется все это делается одним запросом.

if (isset($_POST['word'], $_POST['vocabulary'])){
    $word = $_POST['word'];
    $vocabulary = $_POST['vocabulary'];

    $query = "DELETE FROM `words` WHERE `word` =? and `vocabulary` = ?";
    $stmt = $connection->prepare($query);
    $stmt->bind_param("ss", $word, $vocabulary);
    $stmt->execute();
    if($stmt->affected_rows){
        $_SESSION['smsq'] = "Слово удалено!";
    } else {
        $_SESSION['fsmsq'] = "Ошибка!";
    }
}
header('Location: ../edit-voc.php');


Отдельно замечу что никогда не надо писать or die("Ошибка: ".mysqli_error($connection));ю Вместо этого в файле с коннектом надо один раз написать
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

и тогда РНР обо всех ошибках запросов будет сообщать самостоятельно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы