Я пытаюсь написать простой запрос, который удалит событие на основе его event_id. Однако этот event_id может находиться в 1 из 3 таблиц в базе данных.
Лиги Турниры Тренинги
Каждый event_id генерируется функцией рандомизатора, поэтому каждый идентификатор уникален.
Я пробовал несколько разных синтаксисов для SQL, но ни один из них не удалит событие из таблицы БД. Какие-либо предложения?
Вот что у меня есть:
if (isset($_POST['delete'])){
$query = "delete from leagues where event_id= '$event_id', delete from tournaments where event_id= '$event_id', delete from trainings where event_id= '$event_id'";
$result = mysqli_query($conn, $query);
header('location: index_admin.php');
} else {
}
Я также пробовал использовать команду union, используя несколько запросов на удаление, ставя точку с запятой после каждой команды удаления. Что еще я могу попробовать?
Синтаксис вашего запроса неверен: вы не можете просто объединить три запроса, разделенных запятыми, но, более того, вы, похоже, не инициализировали $event_id
, поэтому ваш запрос не будет включать идентификатор для удаления.
@ThorstenKettner вы имеете в виду так: $query = "удалить из лиг, где event_id='$event_id' удалить из турниров, где event_id='$event_id' удалить из тренировок, где event_id='$event_id'";?
@TangentiallyPerpendicular Извините, я не захватил всю страницу, у меня есть $event_id, инициализированный выше. Запрос работает, когда я ориентируюсь только на 1 таблицу БД, мне просто нужно иметь возможность ориентироваться на все 3 в одном запросе.
Я имею в виду это: $query = "delete from leagues where event_id ='$event_id'"
. Тогда: $query = "delete from tournaments where event_id ='$event_id'"
. Напоследок: $query = "delete from trainings where event_id ='$event_id'"
.
if (isset($_POST['delete'])){
$stmt = $pdo->prepare('delete from leagues where event_id = :event_id');
$stmt->execute([ ':event_id' => $event_id]);
$res = $stmt->fetch();
header('location: index_admin.php');
}else{
}
Это опасно, подвержено SQL-инъекциям: php.net/manual/en/security.database.sql-injection.php
Это сработало для меня. Спасибо всем за помощь!
Нет причин выполнять 3 отдельных DELETE.
DELETE leagues, tournaments, trainings
FROM (SELECT $event_id AS event_id) src -- use parameter instead of immediate insert
LEFT JOIN leagues USING (event_id)
LEFT JOIN tournaments USING (event_id)
LEFT JOIN trainings USING (event_id)
Конечно, вы не будете вставлять значение в запрос, как указано выше, — вы будете использовать подготовленный оператор.
Просто сделайте три отдельных оператора удаления, которые вы запускаете один за другим.