software:development:web:docs:learn:mariadb:вatabase_creation_pdo
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| software:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/23 08:39] – [Фильтрация данных в PDO] VladPolskiy | software:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/23 11:53] (текущий) – [Дополнения и Файлы] VladPolskiy | ||
|---|---|---|---|
| Строка 639: | Строка 639: | ||
| </ | </ | ||
| ===== Обновление данных в PDO ===== | ===== Обновление данных в PDO ===== | ||
| + | Для обновления применяется **%%sql%%**-команда **%%UPDATE%%**: | ||
| + | <code sql SQL> | ||
| + | UPDATE Таблица | ||
| + | SET столбец1 = значение1, | ||
| + | WHERE столбец = значение | ||
| + | </ | ||
| + | В библиотеке **%%pdo%%** для обновления данных может применяться тот же метод **%%exec()%%** объекта **%%PDO%%**, | ||
| + | <code sql SQL> | ||
| + | CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), | ||
| + | </ | ||
| + | Изменим в этой таблице поле **%%pass%%** для строки, | ||
| + | <code sql update_user_db.php> | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $affectedRowsNumber = $conn-> | ||
| + | echo " | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Результат метода $conn-> | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Однако если данные на обновление приходят извне, то мы опять как и при добавлении сталкиваемся с потенциальной уязвимостью подобного подхода. Поэтому в этом случаае опять же лучше использовать параметризацию и **%%prepared statements%%**. | ||
| + | |||
| + | Отправка данных из формы и обновление | ||
| + | Сначала определим файл **%%index_test.php%%**, | ||
| + | <code php index_test.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | echo "< | ||
| + | foreach($result as $row){ | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "</ | ||
| + | } | ||
| + | echo "</ | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | Здесь используется команда **%%SELECT%%**, | ||
| + | |||
| + | Теперь определим файл **%%update_user.php%%** для редактирования пользователей: | ||
| + | <code php update_user.php> | ||
| + | <? | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | die(" | ||
| + | } | ||
| + | ?> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | <?php | ||
| + | // если запрос GET | ||
| + | if($_SERVER[" | ||
| + | { | ||
| + | $userid = $_GET[" | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | // выполняем выражение и получаем пользователя по id | ||
| + | $stmt-> | ||
| + | if($stmt-> | ||
| + | foreach ($stmt as $row) { | ||
| + | $username = $row[" | ||
| + | $userpass = $row[" | ||
| + | $userstatus = $row[" | ||
| + | } | ||
| + | echo "< | ||
| + | <form method=' | ||
| + | <input type=' | ||
| + | < | ||
| + | <input type=' | ||
| + | < | ||
| + | <input type=' | ||
| + | < | ||
| + | <input type=' | ||
| + | <input type=' | ||
| + | </ | ||
| + | } | ||
| + | else{ | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | elseif (isset($_POST[" | ||
| + | | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | | ||
| + | $stmt-> | ||
| + | header(" | ||
| + | } | ||
| + | else{ | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | При нажатии на кнопку **Обновить** браузер переместит нас на страницу обновления данных пользователя **update_user.php** | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Весь код обновления структурно делится на две части. В первой части мы обрабатываем запрос **%%Get%%**. Когда пользователь нажимает на ссылку **%%" | ||
| + | <code sql SQL> | ||
| + | if($_SERVER[" | ||
| + | </ | ||
| + | И если это запрос **%%GET%%**, | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | </ | ||
| + | Далее получаем полученные данные и, если они имеются, | ||
| + | |||
| + | Вторая часть скрипта представляет обработку **%%POST%%**-запроса - когда пользователь нажимает на кнопку на форме, то будет отправляться **%%POST%%**-запрос с отправленными данными. Мы получаем эти данные и отправляем базе данных команду **%%UPDATE%%** с этими данными, | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | </ | ||
| + | После выполнения запроса к БД перенаправляем пользователя на скрипт **index_test.php** с помощью | ||
| + | функции | ||
| + | <code php update_user.php> | ||
| + | header(" | ||
| + | </ | ||
| + | ===== Удаление данных в PDO ===== | ||
| + | Для удаления данных применяется sql-команда DELETE: | ||
| + | <code php delete_user.php> | ||
| + | DELETE FROM Таблица | ||
| + | WHERE столбец = значение | ||
| + | </ | ||
| + | Для удаления данных также может применяться метод **%%exec()%%** объекта **PDO**. Например, | ||
| + | <code sql SQL> | ||
| + | CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), | ||
| + | </ | ||
| + | Рассмотрим следующий пример удаления пользователя со значением **id = 5** | ||
| + | <code sql delete_user.php> | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $affectedRowsNumber = $conn-> | ||
| + | echo " | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | Результат метода **%%$conn-> | ||
| + | \\ | ||
| + | |||
| + | </ | ||
| + | Итак, определим для вывода всех объектов из БД скрипт **index_test.php**: | ||
| + | <code php index_test.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | echo "< | ||
| + | foreach($result as $row){ | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | <input type=' | ||
| + | <input type=' | ||
| + | </ | ||
| + | echo "</ | ||
| + | } | ||
| + | echo "</ | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | В таблицы для каждой строки определена форма, которая посылает данные в **%%POST%%**-запросе скрипту **%%delete.php%%**. Чтобы передать в **%%delete.php%%** идентификатор удаляемого объекта, | ||
| + | |||
| + | Обратите внимание, | ||
| + | |||
| + | <code html exsample.html> | ||
| + | <a href=" | ||
| + | </ | ||
| + | |||
| + | которая оправляет данные в GET-запросе, | ||
| + | |||
| + | <code html exsample.html> | ||
| + | <img src=" | ||
| + | </ | ||
| + | |||
| + | В итоге при открытии письма 1-я запись в таблице может быть удалена. Уязвимость касается не только писем, но может проявляться и в других местах, | ||
| + | |||
| + | Теперь определим сам скрипт **delete_user.php**, | ||
| + | <code sql delete_user.php> | ||
| + | <?php | ||
| + | if(isset($_POST[" | ||
| + | { | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | header(" | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | В данном случае скрипт получает через POST-запрос значение id и по этому идентификатору выполняет удаление. После чего происходит переадресация на скрипт index_test.php. | ||
| + | \\ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Результат работы скрипта, | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Заключение ===== | ||
| + | Изменим пути переадресации в файлах **delete_user** и **update_user** | ||
| + | <code php exsample.php> | ||
| + | header(" | ||
| + | </ | ||
| + | Также добавим данный код в строку | ||
| + | <code php create_user_form.php> | ||
| + | if($affectedRowsNumber > 0 ){ | ||
| + | echo " | ||
| + | header(" | ||
| + | </ | ||
| + | И наконец создадим файл **setting_user** который будет объединять вышенаписанное в один файл управления пользователями | ||
| + | <code php setting_user.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <?php | ||
| + | echo "< | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | echo "< | ||
| + | foreach($result as $row){ | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | <input type=' | ||
| + | <input type=' | ||
| + | </ | ||
| + | echo "</ | ||
| + | } | ||
| + | echo "</ | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| ===== Дополнения и Файлы ===== | ===== Дополнения и Файлы ===== | ||
| + | * [[https:// | ||
| + | <note shadow> | ||
| + | {{ : | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{ : | ||
| + | </ | ||
software/development/web/docs/learn/mariadb/вatabase_creation_pdo.1771825169.txt.gz · Последнее изменение: — VladPolskiy
