Инструменты пользователя

Инструменты сайта


software:development:web:docs:learn:mariadb:вatabase_creation_pdo

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
software:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/23 08:39] – [Фильтрация данных в PDO] VladPolskiysoftware:development:web:docs:learn:mariadb:вatabase_creation_pdo [2026/02/23 11:53] (текущий) – [Дополнения и Файлы] VladPolskiy
Строка 639: Строка 639:
 </note> </note>
 ===== Обновление данных в PDO ===== ===== Обновление данных в PDO =====
 +Для обновления применяется **%%sql%%**-команда **%%UPDATE%%**:
 +<code sql SQL>
 +UPDATE Таблица
 +SET столбец1 = значение1, столбец2 = значение2,...
 +WHERE столбец = значение 
 +</code>
 +В библиотеке **%%pdo%%** для обновления данных может применяться тот же метод **%%exec()%%** объекта **%%PDO%%**, который применяется при добавлении. Например, возьмем использованную в прошлых темах таблицу **%%Users%%** со следующим определением:
 +<code sql SQL>
 +CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), pass VARCHAR(30), status VARCHAR(30))
 +</code>
 +Изменим в этой таблице поле **%%pass%%** для строки, которая имеет **%%id = 11%%**:
 +<code sql update_user_db.php>
 +<?php
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +    $sql = "UPDATE Users SET pass = 777 WHERE id = 11";
 +    $affectedRowsNumber = $conn->exec($sql);
 +    echo "Обновлено строк: $affectedRowsNumber";
 +}
 +catch (PDOException $e) {
 +    echo "Database error: " . $e->getMessage();
 +}
 +?>
 +</code>
 +http://localhost/update_user_db.php
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_update_user_db.php_27.png|}}
 +</note>
 +Результат метода $conn->exec() в данном случае количество обновленных строк.\\  
 +http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_update_user_db.php_28.png|}}
 +</note>
 +Однако если данные на обновление приходят извне, то мы опять как и при добавлении сталкиваемся с потенциальной уязвимостью подобного подхода. Поэтому в этом случаае опять же лучше использовать параметризацию и **%%prepared statements%%**.
 +
 +Отправка данных из формы и обновление
 +Сначала определим файл **%%index_test.php%%**, который будет выводить список пользователей:
 +<code php index_test.php>
 +<!DOCTYPE html>
 +<html>
 +<head>
 +<title>index_test.php</title>
 +<meta charset="utf-8" />
 +</head>
 +<body>
 +<h2>Список пользователей</h2>
 +<?php
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +    $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["pass"] . "</td>";
 +            echo "<td><a href='update_user.php?id=" . $row["id"] . "'>Обновить</a></td>";
 +        echo "</tr>";
 +    }
 +    echo "</table>";
 +}
 +catch (PDOException $e) {
 +    echo "Ошибка базы данных: " . $e->getMessage();
 +}
 +?>
 +</body>
 +</html>
 +</code>
 +Здесь используется команда **%%SELECT%%**, которая получает всех пользователей из таблицы Users. В таблице третий столбец хранит ссылку на скрипт **%%update_user.php%%**, который мы далее создадим и которому передается параметр **%%id%%** с идентификатором пользователя, которого надо изменить.
 +
 +Теперь определим файл **%%update_user.php%%** для редактирования пользователей:
 +<code php update_user.php>
 +<?php 
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +}
 +catch (PDOException $e) {
 +    die("Database error: " . $e->getMessage());
 +}
 +?>
 +<!DOCTYPE html>
 +<html>
 +<head>
 +<title>update_user.php</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"];
 +            $userpass = $row["pass"];
 +            $userstatus = $row["status"];
 +        }
 +        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='text' name='pass' value='$userpass' /></p>
 +                    <p>Роль:
 +                    <input type='text' name='status' value='$userstatus' /></p>
 +                    <input type='submit' value='Сохранить' />
 +            </form>";
 +    }
 +    else{
 +        echo "Пользователь не найден";
 +    }
 +}
 +elseif (isset($_POST["id"]) && isset($_POST["name"]) && isset($_POST["pass"]) && isset($_POST["status"])) {
 +      
 +    $sql = "UPDATE Users SET name = :username, pass = :userpass, status = :userstatus WHERE id = :userid";
 +    $stmt = $conn->prepare($sql);
 +    $stmt->bindValue(":userid", $_POST["id"]);
 +    $stmt->bindValue(":username", $_POST["name"]);
 +    $stmt->bindValue(":userpass", $_POST["pass"]);
 +    $stmt->bindValue(":userstatus", $_POST["status"]);
 +          
 +    $stmt->execute();
 +    header("Location: index_test.php");
 +}
 +else{
 +    echo "Некорректные данные";
 +}
 +?>
 +</body>
 +</html>
 +</code>
 +http://localhost/index_test.php
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_update_user_db.php_30.png|}}
 +</note>
 +При нажатии на кнопку **Обновить** браузер переместит нас на страницу обновления данных пользователя **update_user.php**
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_update_user_db.php_31.png|}}
 +</note>
 +http://localhost/phpmyadmin/index.php?route=/sql&pos=0&db=blog&table=users
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_update_user_db.php_32.png|}}
 +</note>
 +Весь код обновления структурно делится на две части. В первой части мы обрабатываем запрос **%%Get%%**. Когда пользователь нажимает на ссылку **%%"Обновить"%%** на странице **%%index_test.php%%**, то отправляется запрос **%%GET%%**, в котором передается **%%id%%** редактируемого пользователя. Поэтому мы сначала смотрим, представляет ли запрос **%%GET%%**-запрос и имеет ли он параметр **%%id%%**.
 +<code sql SQL>
 +if($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["id"]))
 +</code>
 +И если это запрос **%%GET%%**, то нам надо вывести данные редактируемого пользователя в поля формы. Для этого отправляем базе данных запрос
 +<code sql SQL>
 +$sql = "SELECT * FROM Users WHERE id = :userid";
 +$stmt = $conn->prepare($sql);
 +$stmt->bindValue(":userid", $userid);
 +$stmt->execute();
 +</code>
 +Далее получаем полученные данные и, если они имеются, выводим их в поля формы. Таким образом, пользователь увидит на форме данные редактируемого объекта.
 +
 +Вторая часть скрипта представляет обработку **%%POST%%**-запроса - когда пользователь нажимает на кнопку на форме, то будет отправляться **%%POST%%**-запрос с отправленными данными. Мы получаем эти данные и отправляем базе данных команду **%%UPDATE%%** с этими данными, используя при этом параметризацию запроса:
 +<code sql SQL>
 +$sql = "UPDATE Users SET name = :username, pass = :userpass, status = :userstatus WHERE id = :userid";
 +$stmt = $conn->prepare($sql);
 +$stmt->bindValue(":userid", $_POST["id"]);
 +$stmt->bindValue(":username", $_POST["name"]);
 +$stmt->bindValue(":userpass", $_POST["pass"]);
 +$stmt->bindValue(":userstatus", $_POST["status"]);
 +$stmt->execute();
 +</code>
 +После выполнения запроса к БД перенаправляем пользователя на скрипт **index_test.php** с помощью 
 +функции
 +<code php update_user.php>
 +header("Location: index_test.php");
 +</code>
 +===== Удаление данных в PDO =====
 +Для удаления данных применяется sql-команда DELETE:
 +<code php delete_user.php>
 +DELETE FROM Таблица
 +WHERE столбец = значение
 +</code>
 +Для удаления данных также может применяться метод **%%exec()%%** объекта **PDO**. Например, возьмем использованную в прошлых темах таблицу Users со следующим определением:
 +<code sql SQL>
 +CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), pass VARCHAR(30), STATUS VARCHAR(30))
 +</code>
 +Рассмотрим следующий пример удаления пользователя со значением **id = 5**
 +<code sql delete_user.php>
 +<?php
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +    $sql = "DELETE FROM Users WHERE id = 5";
 +    $affectedRowsNumber = $conn->exec($sql);
 +    echo "Удалено строк: $affectedRowsNumber";
 +}
 +catch (PDOException $e) {
 +    echo "Ошибка базы данных: " . $e->getMessage();
 +}
 +?>
 +</code>
 +Результат метода **%%$conn->exec()%%** в данном случае количество удаленых строк. Однако опять же поскольку значение столбца, на основе которого происходит удаление, нередко приходит извне, то в этом случае лучше использовать параметризацию.
 +\\  
 +
 +</code>
 +Итак, определим для вывода всех объектов из БД скрипт **index_test.php**:
 +<code php index_test.php>
 +<!DOCTYPE html>
 +<html>
 +<head>
 +<title>index_test.php</title>
 +<meta charset="utf-8" />
 +</head>
 +<body>
 +<h2>Список пользователей</h2>
 +<?php
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +    $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["pass"] . "</td>";
 +            echo "<td><form action='delete_user.php' method='post'>
 +                        <input type='hidden' name='id' value='" . $row["id"] . "' />
 +                        <input type='submit' value='Удалить'>
 +                    </form></td>";
 +        echo "</tr>";
 +    }
 +    echo "</table>";
 +}
 +catch (PDOException $e) {
 +    echo "Ошибка базы данных: " . $e->getMessage();
 +}
 +?>
 +</body>
 +</html>
 +</code>
 +
 +В таблицы для каждой строки определена форма, которая посылает данные в **%%POST%%**-запросе скрипту **%%delete.php%%**. Чтобы передать в **%%delete.php%%** идентификатор удаляемого объекта, на форме определено скрытое поле для хранения **%%id%%** объекта.
 +
 +Обратите внимание, что в данном случае применяется не ссылка для удаления типа
 +
 +<code html exsample.html>
 +<a href="http://адрес_нашего_сайта/delete_user.php?id=1">Удалить<a/>
 +</code>
 +
 +которая оправляет данные в GET-запросе, а именно форма, которая отправляет данные в POST-запросе. Почему? Подобные GET-запросы потенциально небезопасны. Допустим, нам пришло электронное письмо, в которое была внедрена картинка посредством тега:
 +
 +<code html exsample.html>
 +<img src="http://адрес_нашего_сайта/delete_user.php?id=1" />
 +</code>
 +
 +В итоге при открытии письма 1-я запись в таблице может быть удалена. Уязвимость касается не только писем, но может проявляться и в других местах, но смысл один - **GET**-запрос к скрипту, который удаляет данные, несет потенциальную уязвимость.
 +
 +Теперь определим сам скрипт **delete_user.php**, который будет выполнять удаление:
 +<code sql delete_user.php>
 +<?php
 +if(isset($_POST["id"]))
 +{
 +    try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +        $sql = "DELETE FROM Users WHERE id = :userid";
 +        $stmt = $conn->prepare($sql);
 +        $stmt->bindValue(":userid", $_POST["id"]);
 +        $stmt->execute();
 +        header("Location: index_test.php");
 +    }
 +    catch (PDOException $e) {
 +        echo "Ошибка базы данных: " . $e->getMessage();
 +    }
 +}
 +?>
 +</code>
 +В данном случае скрипт получает через POST-запрос значение id и по этому идентификатору выполняет удаление. После чего происходит переадресация на скрипт index_test.php.
 +\\  
 +http://localhost/index_test.php
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_delete_user_db.php_35.png|}}
 +</note>
 +Результат работы скрипта, удаление записи 
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_delete_user_db.php_37.png|}}
 +</note>
 +
 +
 +
 +
 +
 +===== Заключение =====
 +Изменим пути переадресации в файлах **delete_user** и **update_user** 
 +<code php exsample.php>
 +header("Location: setting_user.php");
 +</code>
 +Также добавим данный код в строку
 +<code php create_user_form.php>
 +        if($affectedRowsNumber > 0 ){
 +            echo "Данные успешно добавлены: name=$username  pass= $userpass status= user";
 +            header("Location: setting_user.php");
 +</code> 
 +И наконец создадим файл **setting_user** который будет объединять вышенаписанное в один файл управления пользователями
 +<code php setting_user.php>
 +<!DOCTYPE html>
 +<html>
 +<head>
 +<title>setting_user.php</title>
 +<meta charset="utf-8" />
 +</head>
 +<body>
 +<h2>Список пользователей</h2>
 +<?php
 + echo "<td><a href='create_user_form.php'>Добавить пользователя</a></td>";
 +try {
 +    $conn = new PDO("mysql:host=localhost;dbname=blog", "root", "");
 +    $sql = "SELECT * FROM Users";
 +    $result = $conn->query($sql);
 +    echo "<table><tr><th>id</th><th>Имя</th><th>Пароль</th><th>Роль</th></tr>";
 +    foreach($result as $row){
 +        echo "<tr>";
 + echo "<td>" . $row["id"] . "</td>";
 +            echo "<td>" . $row["name"] . "</td>";
 +            echo "<td>" . $row["pass"] . "</td>";
 + echo "<td>" . $row["status"] . "</td>";
 + echo "<td><a href='update_user.php?id=" . $row["id"] . "'>Обновить</a></td>";
 +            echo "<td><form action='delete_user.php' method='post'>
 +                        <input type='hidden' name='id' value='" . $row["id"] . "' />
 +                        <input type='submit' value='Удалить'>
 +                    </form></td>";
 +        echo "</tr>";
 +    }
 +    echo "</table>";
 +}
 +catch (PDOException $e) {
 +    echo "Ошибка базы данных: " . $e->getMessage();
 +}
 +?>
 +</body>
 +</html>
 +</code>
 +http://localhost/setting_user.php
 +<note shadow>
 +{{:software:development:web:docs:learn:mariadb:pdo_setting_user.php_40.png|}}
 +</note>
 +
 ===== Дополнения и Файлы ===== ===== Дополнения и Файлы =====
 +  * [[https://metanit.com/php/mysql/2.1.php|Ссылка на оригинальную статью]]
 +<note shadow>
 +{{ :software:development:web:docs:learn:mariadb:exsample_pdo_db_230226.rar |Файлы руководства}}
 +</note>
 +<note shadow>
 +{{ :software:development:web:docs:learn:mariadb:exsample_admin_panel_pdo_db_23.02.26.rar |Админ панель}}
 +</note>
software/development/web/docs/learn/mariadb/вatabase_creation_pdo.1771825169.txt.gz · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki