Задать вопрос
@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, сколько раз использовать и т.д. ...
Или можно по-другому сделать?
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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);

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽