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

Обновление данных PDO

Для обновления применяется sql-команда UPDATE:

UPDATE Таблица
SET столбец1 = значение1, столбец2 = значение2,...
WHERE столбец = значение

В библиотеке pdo для обновления данных может применяться тот же метод exec() объекта PDO, который применяется при добавлении. Например, возьмем использованную в прошлых темах таблицу Users со следующим определением:

CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)

Изменим в этой таблице поле age для строки, которая имеет id = 1:

<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=test", "root", "mypassword");
$sql = "UPDATE Users SET age = 22 WHERE id = 1";
$affectedRowsNumber = $conn->exec($sql);
echo "Обновлено строк: $affectedRowsNumber";
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>

Результат метода $conn->exec() в данном случае количество обновленных строк.

Однако если данные на обновление приходят извне, то мы опять как и при добавлении сталкиваемся с потенциальной уязвимостью подобного подхода. Поэтому в этом случаае опять же лучше использовать параметризацию и prepared statements.

Отправка данных из формы и обновление

Сначала определим файл index.php, который будет выводить список пользователей:

<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
$sql = "SELECT * FROM Users";
$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><a href='update.php?id=" . $row["id"] . "'>Обновить</a></td>";
echo "</tr>";
}
echo "</table>";
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>
</body>
</html>

Здесь используется команда SELECT, которая получает всех пользователей из таблицы Users. В таблице третий столбец хранит ссылку на скрипт update.php, который мы далее создадим и которому передается параметр id с идентификатором пользователя, которого надо изменить.

Теперь определим файл update.php для редактирования пользователей:

<?php 
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
}
catch (PDOException $e) {
die("Database error: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<?php
// если запрос GET
if($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["id"])) {
$userid = $_GET["id"];
$sql = "SELECT * FROM Users WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $userid);
// выполняем выражение и получаем пользователя по id
$stmt->execute();
if($stmt->rowCount() > 0) {
foreach ($stmt as $row) {
$username = $row["name"];
$userage = $row["age"];
}
echo "<h3>Обновление пользователя</h3>
<form method='post'>
<input type='hidden' name='id' value='$userid' />
<p>Имя:
<input type='text' name='name' value='$username' /></p>
<p>Возраст:
<input type='number' name='age' value='$userage' /></p>
<input type='submit' value='Сохранить' />
</form>";
}
else{
echo "Пользователь не найден";
}
}
elseif (isset($_POST["id"]) && isset($_POST["name"]) && isset($_POST["age"])) {
$sql = "UPDATE Users SET name = :username, age = :userage WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $_POST["id"]);
$stmt->bindValue(":username", $_POST["name"]);
$stmt->bindValue(":userage", $_POST["age"]);
$stmt->execute();
header("Location: index.php");
}
else{
echo "Некорректные данные";
}
?>
</body>
</html>

Весь код обновления структурно делится на две части. В первой части мы обрабатываем запрос Get. Когда пользователь нажимает на ссылку "Обновить" на странице index.php, то отправляется запрос GET, в котором передается id редактируемого пользователя. Поэтому мы сначала смотрим, представляет ли запрос GET-запрос и имеет ли он параметр id.

if($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["id"]))

И если это запрос GET, то нам надо вывести данные редактируемого пользователя в поля формы. Для этого отправляем базе данных запрос:

$sql = "SELECT * FROM Users WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $userid);
$stmt->execute();

Далее получаем полученные данные и, если они имеются, выводим их в поля формы. Таким образом, пользователь увидит на форме данные редактируемого объекта.

Вторая часть скрипта представляет обработку POST-запроса - когда пользователь нажимает на кнопку на форме, то будет отправляться POST-запрос с отправленными данными. Мы получаем эти данные и отправляем базе данных команду UPDATE с этими данными, используя при этом параметризацию запроса:

$sql = "UPDATE Users SET name = :username, age = :userage WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $_POST["id"]);
$stmt->bindValue(":username", $_POST["name"]);
$stmt->bindValue(":userage", $_POST["age"]);
$stmt->execute();

После выполнения запроса к БД перенаправляем пользователя на скрипт index.php с помощью функции:

header("Location: index.php");

Таким образом, пользователь обращается к скрипту index.php, видит таблицу с данными и нажимает на ссылку "Обновить" в одной из строк:

После нажатия его перебрасывает на скрипт update.php, который выводит данные редактируемого объекта. Пользователь изменяет данные и нажимает на кнопку:

Данные в запросе POST отправляются этому же скрипту update.php, который сохраняет данные и перенаправляет пользователя обратно на index.php.

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг