software:development:web:docs:learn:mariadb:вatabase_creation_pdo
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| software:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/22 20:54] – [Создание базы данных и таблиц] VladPolskiy | software:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/23 11:53] (текущий) – [Дополнения и Файлы] VladPolskiy | ||
|---|---|---|---|
| Строка 172: | Строка 172: | ||
| <note shadow> | <note shadow> | ||
| {{: | {{: | ||
| + | </ | ||
| + | Обратите внимание, | ||
| + | |||
| + | И после успешного выполнения запрос мы увидим в браузере сообщение об создании таблицы: | ||
| + | |||
| + | <note green> | ||
| + | ===== Добавление данных в PDO и параметризация запросов ===== | ||
| + | Для добавления данных в БД MySQL применяется sql-команда INSERT, которая имеет следующий синтаксис: | ||
| + | <code sql SQL> | ||
| + | INSERT INTO название_таблицы (столбец1, | ||
| + | </ | ||
| + | Данная команда также выполняется методом **%%exec()%%** объекта PDO. Стоит отметить, | ||
| + | |||
| + | Сначала рассмотрим простейшее добавление одного объекта в БД. Для примера возьмем созданную в прошлой теме базу данных " | ||
| + | <code sql SQL> | ||
| + | CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), | ||
| + | </ | ||
| + | И для добавления определим следующий скрипт PHP: | ||
| + | <code sql insert_user_db.php> | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | |||
| + | // SQL-выражение для добавления данных | ||
| + | $sql = " | ||
| + | |||
| + | $affectedRowsNumber = $conn-> | ||
| + | echo "В таблицу Users добавлено строк: $affectedRowsNumber"; | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Команда на добавление здесь выглядит следующим образом: | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | </ | ||
| + | То есть в столбец **name** добавляется строка " | ||
| + | |||
| + | При добавлении мы получаем количество добавленных строк в переменую **%%$affectedRowsNumber%%** и затем выводим ее значение в браузере. Поэтому при успешном добавлении мы увидим | ||
| + | |||
| + | <note green> | ||
| + | В таблицу **Users** добавлено строк: 1 | ||
| + | </ | ||
| + | |||
| + | === Множественное добавление === | ||
| + | Также мы можем добавить сразу несколько объектов: | ||
| + | <code sql insert_user_db.php> | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | |||
| + | // SQL-выражение для добавления данных | ||
| + | $sql = " | ||
| + | $sql = " | ||
| + | $sql = " | ||
| + | (' | ||
| + | (' | ||
| + | (' | ||
| + | |||
| + | $affectedRowsNumber = $conn-> | ||
| + | echo "В таблицу Users добавлено строк: $affectedRowsNumber"; | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Здесь в таблицу добавляется три строки. Соответственно в браузере мы увидим: | ||
| + | <note green>В таблицу Users добавлено строк: 3</ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ==== Добавление данных из формы HTML ==== | ||
| + | В большинстве случаев добавляемые данные будут приходить из вне, например, | ||
| + | <code php create_user_form.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | <?php | ||
| + | if (isset($_POST[" | ||
| + | |||
| + | $username = $_POST[" | ||
| + | $userpass = $_POST[" | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $affectedRowsNumber = $conn-> | ||
| + | // если добавлена как минимум одна строка | ||
| + | if($affectedRowsNumber > 0 ){ | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | ?> | ||
| + | < | ||
| + | <form method=" | ||
| + | < | ||
| + | <input type=" | ||
| + | < | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Здесь мы проверяем, | ||
| + | <code sql SQL> | ||
| + | if (isset($_POST[" | ||
| + | </ | ||
| + | Если эти данные имеются, | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | </ | ||
| + | Если была добавлена строка, | ||
| + | |||
| + | После кода php собственно определена форма на добавление данных с помощью **%%post%%**-запроса. | ||
| + | Здесь в таблицу добавляется новая строка строки. Соответственно в браузере мы увидим: | ||
| + | <note green> | ||
| + | Данные успешно добавлены: | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ==== Параметризация запросов ==== | ||
| + | Недостаток выше приведенного скрипа заключается в том, что мы никак не констролируем присылаемые данные и сохраняем их в базу данных как есть. Что несет потенциальную угрозу безопасности, | ||
| + | Для решения этих проблем PDO предлагает параметризацию запросов с помощью применения заранее подготовленных выражений - **prepared statement**. Выражения **prepared statement** вместо жестко установленных значений или переменных принимают параметры, | ||
| + | |||
| + | Перепишем предыдущий пример с использованием параметров: | ||
| + | <code sql create_user_form.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | <?php | ||
| + | if (isset($_POST[" | ||
| + | |||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $user = ' | ||
| + | $sql = " | ||
| + | // определяем prepared statement | ||
| + | $stmt = $conn-> | ||
| + | // привязываем параметры к значениям | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | // выполняем prepared statement | ||
| + | $affectedRowsNumber = $stmt-> | ||
| + | // если добавлена как минимум одна строка | ||
| + | if($affectedRowsNumber > 0 ){ | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | ?> | ||
| + | < | ||
| + | <form method=" | ||
| + | < | ||
| + | <input type=" | ||
| + | < | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | В SQL-выражении теперь применяются параметры: | ||
| + | |||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | </ | ||
| + | **%%: | ||
| + | |||
| + | Само выражение **prepared statement** создается с помощью метода **%%prepare()%%** объекта PDO, в который передается выполняемая sql-команда: | ||
| + | <code sql SQL> | ||
| + | $stmt = $conn-> | ||
| + | </ | ||
| + | Фактически здесь создается объект **%%PDOStatement%%**, | ||
| + | |||
| + | Чтобы связать параметр с конкретным значением у объекта **%%PDOStatement%%** вызывается метод **%%bindValue()%%**. Первый параметр этого метода - собственно параметр из sql-команды, | ||
| + | <code sql SQL> | ||
| + | $stmt-> | ||
| + | </ | ||
| + | Так, в данном случае параметр **%%: | ||
| + | |||
| + | Причем привязка может производиться и к конкретным значениям и обычным переменным, | ||
| + | <code sql SQL> | ||
| + | $user = " | ||
| + | // привязка к переменной $user | ||
| + | $stmt-> | ||
| + | </ | ||
| + | Для выполнения sql-выражения у объекта PDOStatement вызывается метод **%%execute()%%**, | ||
| + | ==== Передача значений параметрам через массив по имени ==== | ||
| + | В примере выше для параметризации применялся метод **%%bindValue()%%**: | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | // определяем prepared statement | ||
| + | $stmt = $conn-> | ||
| + | // привязываем параметры к значениям | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | $stmt-> | ||
| + | // выполняем prepared statement | ||
| + | $affectedRowsNumber = $stmt-> | ||
| + | </ | ||
| + | Но есть и другой способ привязки параметров к значениям - мы можем передать в метод **%%execute()%%** параметры и их значения в виде ассоциативного массива: | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | // через массив передаем значения параметрам по имени | ||
| + | $rowsNumber = $stmt-> | ||
| + | </ | ||
| + | В этом случае названия параметров являются ключами. | ||
| + | |||
| + | ==== Передача значений параметрам через массив по позиции ==== | ||
| + | Третий способ привязки значений к параметрам представляет передачу значений по позиции: | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | // определяем prepared statement | ||
| + | $stmt = $conn-> | ||
| + | // привязываем параметры к значениям | ||
| + | $rowsNumber = $stmt-> | ||
| + | </ | ||
| + | В этом случае вместо названий параметров применяются знаки вопроса **%%?%%**. Для передачи этим параметрам значений в метод **%%execute()%%** также передается массив. Первое значение массива привязывается к первому параметру (условно добавляется вместо первого знака вопроса), | ||
| + | ===== Получение данных в PDO ===== | ||
| + | |||
| + | На уровне кода SQL получение данных осуществляется с помощью команды SELECT. Например, | ||
| + | <code sql SQL> | ||
| + | SELECT * FROM Users | ||
| + | </ | ||
| + | В библиотеке pdo для получения данных у объекта PDO вызывается метод **%%query()%%**, | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | </ | ||
| + | | ||
| + | <code sql SQL> | ||
| + | $row = $result-> | ||
| + | </ | ||
| + | При последующих обращениях метод **%%fetch()%%** возвращает следующие строки, | ||
| + | <code sql SQL> | ||
| + | while($row = $result-> | ||
| + | // обработка строк | ||
| + | } | ||
| + | </ | ||
| + | Таким образом, | ||
| + | |||
| + | Строка возвращается в виде ассоциативного массива, | ||
| + | <code sql SQL> | ||
| + | while($row = $result-> | ||
| + | $username = $row[" | ||
| + | // операции с $username | ||
| + | } | ||
| + | </ | ||
| + | Вместо цикла **%%while%%** можно использовать цикл **%%for/ | ||
| + | <code sql SQL> | ||
| + | foreach($result as $row){ | ||
| + | $username = $row[" | ||
| + | // операции с $username | ||
| + | } | ||
| + | </ | ||
| + | Здесь явным образом не вызывается метод **%%$result-> | ||
| + | |||
| + | Теперь все объединим и получим данные из таблицы Users из прошлых тем, которая имеет следующее определение: | ||
| + | |||
| + | <code sql select_user_form.php> | ||
| + | <?php | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | echo "< | ||
| + | while($row = $result-> | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo "</ | ||
| + | } | ||
| + | echo "</ | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | В данном случае полученные данные будут выводиться в таблицу, | ||
| + | \\ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | ==== Фильтрация данных в PDO ==== | ||
| + | В прошлой статье применялся метод query() для получения всех данных из БД. Но что, если нам надо получить не все, а какие-то определенные данные, | ||
| + | <code sql SQL> | ||
| + | CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), | ||
| + | </ | ||
| + | Она имеет столбец id, и мы хотим получить определенный объект по id. На первый взгляд мы могли бы определить следующий код: | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $result = $conn-> | ||
| + | </ | ||
| + | Для фильтрации команде **%%SELECT%%** передается выражение **%%WHERE%%**, | ||
| + | |||
| + | Однако если данные для фильтрации приходят извне, например, | ||
| + | |||
| + | Например, | ||
| + | <code sql user.php> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | </ | ||
| + | < | ||
| + | <?php | ||
| + | // зададим переменную для вывода строки | ||
| + | $_GET[" | ||
| + | if(isset($_GET[" | ||
| + | { | ||
| + | try { | ||
| + | $conn = new PDO(" | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | // привязываем значение параметра :userid к $_GET[" | ||
| + | $stmt-> | ||
| + | // выполняем выражение и получаем пользователя по id | ||
| + | $stmt-> | ||
| + | if($stmt-> | ||
| + | foreach ($stmt as $row) { | ||
| + | $username = $row[" | ||
| + | $userpass = $row[" | ||
| + | $userstatus = $row[" | ||
| + | echo "< | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | } | ||
| + | } | ||
| + | else{ | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Для выполнения запроса к БД вначале создаем **%%prepared statement%%**, | ||
| + | <code sql SQL> | ||
| + | $sql = " | ||
| + | $stmt = $conn-> | ||
| + | $stmt-> | ||
| + | </ | ||
| + | Далее у полученного объекта **%%PDOStatement%%** вызываем метод **%%execute()%%**, | ||
| + | <code sql SQL> | ||
| + | $stmt-> | ||
| + | </ | ||
| + | После выполнения команды **%%SELECT%%** этот объект содержит полученные из БД данные, | ||
| + | <code sql SQL> | ||
| + | if($stmt-> | ||
| + | foreach ($stmt as $row) { | ||
| + | $username = $row[" | ||
| + | $userpass = $row[" | ||
| + | $userstatus = $row[" | ||
| + | } | ||
| + | </ | ||
| + | При этом с помощью метода **%%rowCount()%%** мы можем узнать количество возвращенных строк. Получение данных столбцов строки производится как и было описано выше для простого запроса **%%SELECT%%**. Получив данные столбцов в переменные, | ||
| + | Закоментируем явное определение **%%$_GET[" | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | Чтоб было проще обращаться к скрипту **%%user.php%%** и передавать ему **%%id%%**, определим скрипт **%%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 "</ | ||
| + | } | ||
| + | catch (PDOException $e) { | ||
| + | echo " | ||
| + | } | ||
| + | ?> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | http:// | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Здесь все объекты из базы данных выводятся в таблицу, | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Выведем значение, | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ===== Обновление данных в 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.1771782860.txt.gz · Последнее изменение: — VladPolskiy
