Полный цикл в digital

Удаление данных MySQLi

Для удаления данных применяется sql-команда DELETE:

DELETEFROMТаблица
WHEREстолбец=значение

Для удаления данных возьмем использованную в прошлых темах таблицу Users со следующим определением:

CREATETABLEUsers(idINTEGERAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(30),ageINTEGER)

Объектно-ориентированный стиль

Вначале определим для вывода всех объектов из БД скрипт index.php:

<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn->connect_error) {
die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT * FROM Users";
if($result = $conn->query($sql)) {
echo "<table><tr><th>Имя</th><th>Возраст</th><th></th></tr>";
foreach($result as $row) {
echo "<tr>";
echo "<td>" . $row["name"] . "</td>";
echo "<td>" . $row["age"] . "</td>";
echo "<td><form action='delete.php' method='post'>
<input type='hidden' name='id' value='" . $row["id"] . "' />
<input type='submit' value='Удалить'>
</form></td>";
echo "</tr>";
}
echo "</table>";
$result->free();
} else {
echo "Ошибка: " . $conn->error;
}
$conn->close();
?>
</body>
</html>

В таблицы для каждой строки определена форма, которая посылает данные в POST-запросе скрипту delete.php. Чтобы передать в delete.php идентификатор удаляемого объекта, на форме определено скрытое поле для хранения id объекта.

Обратите внимание, что в данном случае применяется не ссылка для удаления типа:

<a href="http://адрес_нашего_сайта/delete.php?id=1">Удалить<a />

которая оправляет данные в GET-запросе, а именно форма, которая отправляет данные в POST-запросе. Почему? Подобные GET-запросы потенциально небезопасны. Допустим, нам пришло электронное письмо, в которое была внедрена картинка посредством тега:

<img src="http://адрес_нашего_сайта/delete.php?id=1" />

В итоге при открытии письма 1-я запись в таблице может быть удалена. Уязвимость касается не только писем, но может проявляться и в других местах, но смысл один - GET-запрос к скрипту, который удаляет данные, несет потенциальную уязвимость.

Теперь определим сам скрипт delete.php, который будет выполнять удаление:

<?php
if(isset($_POST["id"])) {
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn->connect_error) {
die("Ошибка: " . $conn->connect_error);
}
$userid = $conn->real_escape_string($_POST["id"]);
$sql = "DELETE FROM Users WHERE id = '$userid'";
if($conn->query($sql)) {
header("Location: index.php");
}
else {
echo "Ошибка: " . $conn->error;
}
$conn->close();  
}
?>

В данном случае скрипт получает через POST-запрос значение id и по этому идентификатору выполняет удаление. После чего происходит переадресация на скрипт index.php.

Процедурный стиль

Скрипт index.php:

<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $sql)) {
echo "<table><tr><th>Имя</th><th>Возраст</th><th></th></tr>";
foreach($result as $row) {
echo "<tr>";
echo "<td>" . $row["name"] . "</td>";
echo "<td>" . $row["age"] . "</td>";
echo "<td><form action='delete.php' method='post'>
<input type='hidden' name='id' value='" . $row["id"] . "' />
<input type='submit' value='Удалить'>
</form></td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result);
} else {
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>

Скрипт delete.php:

<?php
if(isset($_POST["id"])) {
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$userid = mysqli_real_escape_string($conn, $_POST["id"]);
$sql = "DELETE FROM Users WHERE id = '$userid'";
if(mysqli_query($conn, $sql)) {
header("Location: index.php");
} else {
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);    
}
?>
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг