Практическое занятие № 23
Тема: «Создание элементов управления. Удаление и добавление данных.»
Краткие теоретические основания выполнения задания
Добавление данных в MySQLi
Для добавления данных в MySQL применяется команда INSERT:
INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)
Объектно-ориентированный подход
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn-connect_error){
die("Ошибка: " . $conn-connect_error);
}
$sql = "INSERT INTO Users (name, age) VALUES ('Tom', 37)";
if($conn-query($sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $conn-error;
}
$conn-close();
?
Множественное добавление:
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn-connect_error){
die("Ошибка: " . $conn-connect_error);
}
$sql = "INSERT INTO Users (name, age) VALUES
('Sam', 41),
('Bob', 29),
('Alice', 32)";
if($conn-query($sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $conn-error;
}
$conn-close();
?
Процедурный подход
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$sql = "INSERT INTO Users (name, age) VALUES ('Tom', 37)";
if(mysqli_query($conn, $sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?
Множественное добавление:
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$sql = "INSERT INTO Users (name, age) VALUES
('Sam', 41),
('Bob', 29),
('Alice', 32)";
if(mysqli_query($conn, $sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?
Добавление данных из формы HTML
В большинстве случаев добавляемые данные будут приходить из вне, например, присылаться в запросе пользователя. Рассмотрим добавление данных, отправленных из формы HTML. Для этого определим веб-страницу form.html, на которой определим следующий код:
DOCTYPE html
html
head
titleMETANIT.COMtitle
meta charset="utf-8" /
head
body
h3Добавление пользователяh3
form action="create.php" method="post"
pИмя:
input type="text" name="username" /p
pВозраст:
input type="number" name="userage" /p
input type="submit" value="Добавить"
form
body
html
Здесь определены два поля ввода. И по нажатию на кнопку их данные в запросе POST будут уходить скрипту create.php. Теперь определим сам скрипт create.php.
Объектно-ориентированный подход
if (isset($_POST["username"]) && isset($_POST["userage"])) {
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn-connect_error){
die("Ошибка: " . $conn-connect_error);
}
$name = $conn-real_escape_string($_POST["username"]);
$age = $conn-real_escape_string($_POST["userage"]);
$sql = "INSERT INTO Users (name, age) VALUES ('$name', $age)";
if($conn-query($sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $conn-error;
}
$conn-close();
}
?
Здесь мы проверяем, пришли ли с сервера данные в POST-запросе, которые имеют ключи "username" и "userage":
if (isset($_POST["username"]) && isset($_POST["userage"])) {
...
}
Если эти данные имеются, то есть был отправлен post-запрос с данными на добавление, то мы получаем эти данные в переменные и добавляем их в бд. Но перед добавлением к этим данным применяется метод $conn-real_escape_string(), которая принимает сохраняемое значение и экранирует в нем спецсимволы, что позволяет защитить от SQL-инъекций.
В итоге после ввода данных и нажатия на кнопку данные в запросе POST уйдут скрипту create.php, который сохранит их в базу данных.
Процедурный подход
if (isset($_POST["username"]) && isset($_POST["userage"])) {
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$name = mysqli_real_escape_string($conn, $_POST["username"]);
$age = mysqli_real_escape_string($conn, $_POST["userage"]);
$sql = "INSERT INTO Users (name, age) VALUES ('$name', $age)";
if(mysqli_query($conn, $sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
}
?
Здесь применяется функция mysqli_real_escape_string(). Она служит для экранизации символов в строке, которая потом используется в запросе SQL. В качестве параметров она принимает объект подключения и строку, которую надо экранировать.
Получение данных в MySQLi
Для получения данных в MySQL применяется команда SELECT. Например, получение всех данных из таблицы Users:
SELECT * FROM Users
Рассмотрим получение данных на примере таблицы Users, созданной в прошлых, которая имеет следующее определение:
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)
Объектно-ориентированный стиль
При выполнении команды SELECT метод query() объекта mysqli возвращает набор полученных строк, который мы можем перебрать с помощью цикла. Например, перебор с помощью цикла foreach:
$sql = "SELECT * FROM Users";
if($result = $conn-query($sql)){
foreach($result as $row){
$userid = $row["id"];
$username = $row["name"];
$userage = $row["age"];
}
}
Здесь $result представляет набор строк. Каждый его элемент, который передается в переменную $row, хранит данные отдельной строки в виде ассоциативного массива, где ключи элементов - названия столбцов.
Вместо цикла foreach также можно использовать другие виды циклов. Например, применение цикла while:
$sql = "SELECT * FROM Users";
if($result = $conn-query($sql)){
while($row = $result-fetch_array()){
$userid = $row["id"];
$username = $row["name"];
$userage = $row["age"];
}
}
В данном случае метод $result-fetch_array() выбирает текущую строку из набора в переменную $row и переходит к следующей. Когда строк не останется, метод возвратит false, и произойдет выход из цикда. Полученное значени $row опять же представляет строку в виде ассоциативного массива.
После окончания работы с полученным набором строк мы можем очистить отведенную для него память с помощью метода free():
$result-free();
Теперь посмотрим на примере. Определим скрипт index.php, которая будет выводить значения из таблицы Users:
DOCTYPE html
html
head
titleMETANIT.COMtitle
meta charset="utf-8" /
head
body
h2Список пользователейh2
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn-connect_error){
die("Ошибка: " . $conn-connect_error);
}
$sql = "SELECT * FROM Users";
if($result = $conn-query($sql)){
$rowsCount = $result-num_rows; // количество полученных строк
echo "
Получено объектов: $rowsCount
";
echo "
";
foreach($result as $row){
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
}
echo "
Id | Имя | Возраст |
" . $row["id"] . " | " . $row["name"] . " | " . $row["age"] . " |
";
$result-free();
} else{
echo "Ошибка: " . $conn-error;
}
$conn-close();
?
body
html
Таким образом, при обращении к скрипту index.php браузер отобразит список данных, полученных из БД:
Дополнительно стоит отметить, что с помощью свойства $result-num_rows мы можем получить количество строк, извлеченных из БД.
Процедурный стиль
При процедурном стиле функция mysqli_query() при успешном выполнении команды SELECT возвращает набор строк, который можно перебрать с помощью цикла:
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $sql)){
foreach($result as $row){
$userid = $row["id"];
$username = $row["name"];
$userage = $row["age"];
}
}
Как и при объектно-ориентированном подходе, полученные строки представляют ассоциативные массивы, где ключи элементов - названия столбцов.
Пример перебоа с помощью цикла while:
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $sql)){
while($row = mysqli_fetch_array($result)){
$userid = $row["id"];
$username = $row["name"];
$userage = $row["age"];
}
}
Функция mysqli_fetch_array() выбирает текущую строку из набора в переменную $row и переходит к следующей. Когда строк не останется, метод возвратит false, и произойдет выход из цикла.
После окончания работы с полученным набором строк мы можем очистить отведенную для него память с помощью функции mysqli_free_result(), в которую передается полученный набор строк:
mysqli_free_result($result);
Полный пример:
DOCTYPE html
html
head
titleMETANIT.COMtitle
meta charset="utf-8" /
head
body
h2Список пользователейh2
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $sql)){
$rowsCount = mysqli_num_rows($result); // количество полученных строк
echo "
Получено объектов: $rowsCount
";
echo "
";
foreach($result as $row){
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
}
echo "
Id | Имя | Возраст |
" . $row["id"] . " | " . $row["name"] . " | " . $row["age"] . " |
";
mysqli_free_result($result);
} else{
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?
body
html
Удаление данных в MySQLi
Для удаления данных применяется sql-команда DELETE:
DELETE FROM Таблица
WHERE столбец = значение
Для удаления данных возьмем использованную в прошлых темах таблицу Users со следующим определением:
CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)
Объектно-ориентированный стиль
Вначале определим для вывода всех объектов из БД скрипт index.php:
DOCTYPE html
html
head
titleMETANIT.COMtitle
meta charset="utf-8" /
head
body
h2Список пользователейh2
$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 "
";
foreach($result as $row){
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
}
echo "
Имя | Возраст | |
" . $row["name"] . " | " . $row["age"] . " | . $row["id"] . "' / Удалить' |
";
$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, который будет выполнять удаление:
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
titleMETANIT.COMtitle
meta charset="utf-8" /
head
body
h2Список пользователейh2
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
die("Ошибка: " . mysqli_connect_error());
}
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $sql)){
echo "
";
foreach($result as $row){
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
}
echo "
Имя | Возраст | |
" . $row["name"] . " | " . $row["age"] . " | . $row["id"] . "' / Удалить' |
";
mysqli_free_result($result);
} else{
echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?
body
html
Скрипт delete.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);
}
?
Порядок выполнения задания
-
Изучите краткий теоретический материал к данному практическому занятию.
-
Создайте базу данных и создайте форму-опрос в котором присутствуют поля: Тема сообщения, Фамилия, Имя, Отчество, Электронный ящик, Текст сообщения. Произведите подключение формы и БД.
-
Реализуйте с помощью кнопок функцию добавления данных в БД и удаления данных из БД. Кнопку можно скачать в интернете, нарисовать в графическом редакторе, либо получить средствами CSS
Ресурсы и ссылки:
https://metanit.com/php/mysql/3.3.php
https://metanit.com/php/mysql/3.4.php
https://metanit.com/php/mysql/3.6.php