Вы находитесь на странице: 1из 135

Раздел 7:

MySQL и PHP
План вебинара
План вебинара

– поддержка MySQL в PHP


План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
– получение результата запроса из MySQL
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
– получение результата запроса из MySQL
– обработка ошибок
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
– получение результата запроса из MySQL
– обработка ошибок
– безопасность при выполнении запросов
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
– получение результата запроса из MySQL
– обработка ошибок
– безопасность при выполнении запросов
– подготовленные выражения
План вебинара

– поддержка MySQL в PHP


– подключение к БД из PHP-сценария
– выполнение SQL-запросов
– получение результата запроса из MySQL
– обработка ошибок
– безопасность при выполнении запросов
– подготовленные выражения
– интерактивные демонстрации
Поддержка MySQL в PHP
полноценная работа с СУБД MySQL внутри PHP-
сценариев
Что такое mysqli
mysqli (MySQL Improved) – расширение PHP, которое добавляет в 

язык полную поддержку работы с СУБД MySQL

http://php.net/manual/ru/book.mysqli.php
Что такое mysqli
mysqli (MySQL Improved) – расширение PHP, которое добавляет в 

язык полную поддержку работы с СУБД MySQL

Особенности mysqli:
• реализует семейство функций mysqli_
• поддерживает все возможности MySQL
• хорошая производительность

http://php.net/manual/ru/book.mysqli.php
Схема работы с MySQL
Схема работы с MySQL

Установить подключение к серверу


Схема работы с MySQL

Установить подключение к серверу

Проверить успешность подключения


Схема работы с MySQL

Установить подключение к серверу

Проверить успешность подключения

Сформировать SQL-запрос
Схема работы с MySQL

Установить подключение к серверу

Проверить успешность подключения

Сформировать SQL-запрос

Выполнить SQL-запрос
Схема работы с MySQL

Установить подключение к серверу

Проверить успешность подключения

Сформировать SQL-запрос

Выполнить SQL-запрос

Получить и обработать результат


выполнения запроса
Установить подключение к
MySQL

Получить ресурс
соединения

нет Соединение
успешно?

Показать ошибку
Сформировать SQL запрос

Выполнить SQL запрос

нет Результат да
успешен?

Показать ошибку Запрос на


чтение?

Итерация по полученным
результатам
Подключение к MySQL
В PHP сценарии перед выполнением любых SQL запросов необходимо 

установить подключение к MySQL
Подключение к MySQL
В PHP сценарии перед выполнением любых SQL запросов необходимо 

установить подключение к MySQL

Что необходимо знать:


хост – адрес, где находится сервер
логин – имя пользователя для подключения
пароль – пароль пользователя
база данных – имя базы данных для работы
Информация для подключения

Параметр Значение Примечания

По умолчанию, MySQL устанавливается на тот же


хост localhost компьютер

Пользователь с максимальными правами. 



логин root
Создается вместе с установкой СУБД

Пароль либо пустая строка, либо задается


пароль <пустая строка>
пользователем при установке

база данных Необязательный параметр


Подключение к MySQL
Используйте функцию mysqli_connect, чтобы выполнить 

подключение к MySQL
Подключение к MySQL
Используйте функцию mysqli_connect, чтобы выполнить 

подключение к MySQL

Синтаксис

mysqli_connect(<хост>, <пользователь>, <пароль>, <бд>);


Подключение к MySQL
Используйте функцию mysqli_connect, чтобы выполнить 

подключение к MySQL

Синтаксис

mysqli_connect(<хост>, <пользователь>, <пароль>, <бд>);

Использование

<?php
$con = mysqli_connect("localhost", "root", "","giftube");
Проверка подключения
Всегда необходимо проверять успешность
соединения с MySQL перед продолжением работы
Проверка подключения
Всегда необходимо проверять успешность
соединения с MySQL перед продолжением работы

Что может пойти не так:


• неверные параметры подключения
• сервер СУБД недоступен или перегружен
• нет связи
• ограничение доступа администратором
Пример проверки подключения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

if ($con == false) {
   print("Ошибка подключения: " . mysqli_connect_error());
}
else {
   print("Соединение установлено");
   // выполнение запросов
}
Пример проверки подключения

Ресурс соединения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

if ($con == false) {
   print("Ошибка подключения: " . mysqli_connect_error());
}
else {
   print("Соединение установлено");
   // выполнение запросов
}
Пример проверки подключения

Ресурс соединения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

if ($con == false) {
   print("Ошибка подключения: " . mysqli_connect_error());
}
else {
   print("Соединение установлено"); Получить текст ошибки подключения
   // выполнение запросов
}
Ресурс соединения
Ресурс соединения – это результат выполнения функции mysqli_connect

Ресурс соединения создаётся один раз при подключении к MySQL, 



а затем используется для всех следующих запросов
Выполнение SQL запросов
Два вида запросов
Два вида запросов

Чтение

• Выполняются для получения



данных из БД

• Возвращают ресурс результата

• Оператор - SELECT
Два вида запросов

Чтение Модификация

• Выполняются для получения
 • Нужны для обновления, 



данных из БД добавления и удаления записей

• Возвращают ресурс результата • Возвращают true или false

• Оператор - SELECT • Операторы: 



UPDATE, INSERT, DELETE
Добавление новой записи

1. Сформировать SQL запрос


2. Выполнить SQL запрос
3. Проверить результат выполнения
Добавление новой записи

1. Сформировать SQL запрос


2. Выполнить SQL запрос
3. Проверить результат выполнения

SQL запрос для добавления записи

INSERT INTO users 



SET email = 'developer@php.net', password = 'secret'
Выполнение запросов
mysqli_query - функция для выполнения любых SQL запросов
Выполнение запросов
mysqli_query - функция для выполнения любых SQL запросов

Пример

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net', password = 'secret'";

$result = mysqli_query($con, $sql);
Выполнение запросов
mysqli_query - функция для выполнения любых SQL запросов

Пример

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net', password = 'secret'";

$result = mysqli_query($con, $sql);

Ресурс соединения
Обработка ошибок
Результат выполнения запроса может завершиться ошибкой
Обработка ошибок
Результат выполнения запроса может завершиться ошибкой

Что может пойти не так:


• некорректный синтаксис SQL запроса
• сервер СУБД недоступен или перегружен
• ограничения таблицы (например, уникальные индексы)
• некорректные данные
Обработка ошибок

Пример

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net',
password = 'secret'";

$result = mysqli_query($con, $sql);

if (!$result) {
$error = mysqli_error($con);
print("Ошибка MySQL: " . $error);
}
Обработка ошибок

Пример

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net',
password = 'secret'";

$result = mysqli_query($con, $sql);

if (!$result) {
$error = mysqli_error($con);
print("Ошибка MySQL: " . $error);
}

Возвращает последнюю ошибку 



выполнения SQL запроса
Уникальный идентификатор записи
Идентификатор записи – это её первичный ключ.

Первичный ключ – это особенное поле, в котором сохраняется 



уникальный идентификатор записи.

Первичный ключ нужен, чтобы ссылаться на эту запись.


Получение идентификатора

Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net',
password = 'secret'";

$result = mysqli_query($con, $sql);

if ($result) {
$last_id = mysqli_insert_id($con);
}
Получение идентификатора

Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "INSERT INTO users SET email = 'developer@php.net',
password = 'secret'";

$result = mysqli_query($con, $sql);

if ($result) {
$last_id = mysqli_insert_id($con);
}

Возвращает идентификатор последней 



добавленной записи
Чтение данных из MySQL
Чтение данных из MySQL – это выполнение запросов типа SELECT 

и получение результата
Чтение данных из MySQL
Чтение данных из MySQL – это выполнение запросов типа SELECT 

и получение результата

Последовательность исполнения:
1. Формирование SQL запроса
2. Выполнение запроса
3. Получение объекта результата
4. Преобразование объекта результата 

в двумерный массив
Объект результата
Объект результата – это результат выполнения функции 

mysqli_query при работе с запросами типа SELECT
Объект результата
Объект результата – это результат выполнения функции 

mysqli_query при работе с запросами типа SELECT

Объект результата – это не итоговые данные из БД, 



а скорее ссылка на них
Объект результата
Объект результата – это результат выполнения функции 

mysqli_query при работе с запросами типа SELECT

Объект результата – это не итоговые данные из БД, 



а скорее ссылка на них

Чтобы получить действительные данные, необходимо 



преобразовать объект результата в массив
Объект результата
SELECT * FROM users

БД
Данные ОР Объект результата

$res = mysqli_query($l, $sql);

$rows = mysqli_fetch_all($res);
Пример получения записей
Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "SELECT id, name FROM categories";
$result = mysqli_query($con, $sql);

$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);

foreach ($rows as $row) {
   print("Категория: " . $row['name']);
}
Пример получения записей
Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "SELECT id, name FROM categories";
Объект результата $sql);
$result = mysqli_query($con,

$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);

foreach ($rows as $row) {
   print("Категория: " . $row['name']);
}
Пример получения записей
Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "SELECT id, name FROM categories";
Объект результата $sql);
$result = mysqli_query($con,

$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);

foreach ($rows as $row) {
   print("Категория: " . $row['name']);
}
Преобразуем объект результата

в двумерный массив с записями
Получение записей в виде массива
Из объекта результата полученные из БД записи можно 

преобразовать в привычный, двумерный массив
Получение записей в виде массива
Из объекта результата полученные из БД записи можно 

преобразовать в привычный, двумерный массив

$sql = "SELECT id, name FROM users";


$res = mysqli_query($link, $sql);
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC);
Получение записей в виде массива
Из объекта результата полученные из БД записи можно 

преобразовать в привычный, двумерный массив

$sql = "SELECT id, name FROM users";


$res = mysqli_query($link, $sql);
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC);

$rows = [
['id' => 1, 'name' => 'frexin'],
['id' => 2, 'name' => 'timon'],
['id' => 3, 'name' => 'daredevil'],
];
Как получить одну запись
Для получения единственной записи из результатов запроса 

в виде ассоциативного массива есть функция mysqli_fetch_assoc
Как получить одну запись
Для получения единственной записи из результатов запроса 

в виде ассоциативного массива есть функция mysqli_fetch_assoc

$sql = "SELECT id, name FROM users";


$res = mysqli_query($link, $sql);
$row = mysqli_fetch_assoc($res);
Как получить одну запись
Для получения единственной записи из результатов запроса 

в виде ассоциативного массива есть функция mysqli_fetch_assoc

$sql = "SELECT id, name FROM users";


$res = mysqli_query($link, $sql);
$row = mysqli_fetch_assoc($res);

$row =
['id' => 1, 'name' => 'frexin'];
Получение количества записей
Количество записей – это сколько записей всего вернет 

выполненный SQL запрос на чтение

Узнать количество записей можно используя 



функцию mysqli_num_rows()
Получение количества записей

Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "SELECT id, name FROM categories";
$result = mysqli_query($con, $sql);

$records_count = mysqli_num_rows($result);
Получение количества записей

Пример

<?php
$con = mysqli_connect("localhost", "root", "","giftube");

$sql = "SELECT id, name FROM categories";
$result = mysqli_query($con, $sql);

$records_count = mysqli_num_rows($result);

Возвращает количество записей


Перерыв на 10 минут
Безопасность при выполнении запросов
специальная подготовка SQL-запросов, когда в них
участвуют данные, полученные от пользователей
Откуда могут прийти данные
Откуда могут прийти данные

– Из параметров запроса ($_GET)


Откуда могут прийти данные

– Из параметров запроса ($_GET)


– Из форм ($_POST)
Откуда могут прийти данные

– Из параметров запроса ($_GET)


– Из форм ($_POST)
– Из cookies ($_COOKIES)
Откуда могут прийти данные

– Из параметров запроса ($_GET)


– Из форм ($_POST)
– Из cookies ($_COOKIES)
– Из HTTP-заголовков
Откуда могут прийти данные

– Из параметров запроса ($_GET)


– Из форм ($_POST)
– Из cookies ($_COOKIES)
– Из HTTP-заголовков
– Из загруженных файлов
Смешивание кода и данных
SQL-запросы могут формироваться динамически и включать 

в себя данные от пользователя. Например:
1. Добавление в БД информации из формы
2. Подстановка параметра из URL
Смешивание кода и данных
SQL-запросы могут формироваться динамически и включать 

в себя данные от пользователя. Например:
1. Добавление в БД информации из формы
2. Подстановка параметра из URL

SELECT * FROM gifs WHERE id = $_GET['id']


Смешивание кода и данных
SQL-запросы могут формироваться динамически и включать 

в себя данные от пользователя. Например:
1. Добавление в БД информации из формы
2. Подстановка параметра из URL

SELECT * FROM gifs WHERE id = $_GET['id']

Логика запроса
Смешивание кода и данных
SQL-запросы могут формироваться динамически и включать 

в себя данные от пользователя. Например:
1. Добавление в БД информации из формы
2. Подстановка параметра из URL

SELECT * FROM gifs WHERE id = $_GET['id']

Логика запроса Значения запроса


SQL-инъекция
Что такое SQL-инъекция
SQL-инъекция - это тип уязвимости веб-сайта.
Что такое SQL-инъекция
SQL-инъекция - это тип уязвимости веб-сайта.

Если не фильтровать внешние данные, который входят в 



состав SQL-запроса, то это даёт хакерам возможность 

поменять его в своих целях.
Что такое SQL-инъекция
SQL-инъекция - это тип уязвимости веб-сайта.

Если не фильтровать внешние данные, который входят в 



состав SQL-запроса, то это даёт хакерам возможность 

поменять его в своих целях.

SQL инъекция позволяет хакеру выполнить атаку на приложение, 



поменяв SQL запрос
На что способна SQL-инъекция
На что способна SQL-инъекция

– удалить все данные из БД


На что способна SQL-инъекция

– удалить все данные из БД


– получить всю информацию (включая пароли)
На что способна SQL-инъекция

– удалить все данные из БД


– получить всю информацию (включая пароли)
– поменять информацию выборочно 

(например, сменить пароль администратору)
На что способна SQL-инъекция

– удалить все данные из БД


– получить всю информацию (включая пароли)
– поменять информацию выборочно 

(например, сменить пароль администратору)

– раскрыть информацию о сервере


На что способна SQL-инъекция

– удалить все данные из БД


– получить всю информацию (включая пароли)
– поменять информацию выборочно 

(например, сменить пароль администратору)

– раскрыть информацию о сервере


– загрузить бэкдор
Пример уязвимости

<?php
$con = mysqli_connect("localhost", "root", "","giftube");
$id = $_GET['id'];

$sql = "DELETE FROM gifs WHERE id = '$id'";


$result = mysqli_query($con, $sql);
Пример уязвимости

Данные для запроса из 



внешних параметров
<?php
$con = mysqli_connect("localhost", "root", "","giftube");
$id = $_GET['id'];

$sql = "DELETE FROM gifs WHERE id = '$id'";


$result = mysqli_query($con, $sql);
Пример уязвимости
Пример уязвимости
Запрос хакера

/del.php?id=2' OR 1=1 --
Пример уязвимости
Запрос хакера

/del.php?id=2' OR 1=1 --

Итоговый SQL

DELETE FROM gifs WHERE id = '2' OR 1=1 -- '


Пример уязвимости
Запрос хакера

/del.php?id=2' OR 1=1 --

Итоговый SQL

DELETE FROM gifs WHERE id = '2' OR 1=1 -- '

Хакер подставил в параметр запроса вместо числа строку, которая



поменяла смысл всего SQL-выражения
Пример уязвимости
Запрос хакера

/del.php?id=2' OR 1=1 --

Итоговый SQL

DELETE FROM gifs WHERE id = '2' OR 1=1 -- '

Хакер подставил в параметр запроса вместо числа строку, которая



поменяла смысл всего SQL-выражения

Вместо удаления одной записи с переданным id, модифицированный 



запрос удалил все записи в таблице
Способы защиты
Способы защиты
Как защитить свой SQL-запрос от хакеров:
Способы защиты
Как защитить свой SQL-запрос от хакеров:
1. принудительно привести значение

к числовому типу
Способы защиты
Как защитить свой SQL-запрос от хакеров:
1. принудительно привести значение

к числовому типу
2. экранировать опасные символы
Способы защиты
Как защитить свой SQL-запрос от хакеров:
1. принудительно привести значение

к числовому типу
2. экранировать опасные символы
3. использовать подготовленные 

выражения
Приведение к типу
Часто в SQL запросе ожидается использование числовых значений.
В этом случае имеет смысл принудительно привести значение 

к числовому типу.
Приведение к типу
Часто в SQL запросе ожидается использование числовых значений.
В этом случае имеет смысл принудительно привести значение 

к числовому типу.

DELETE * FROM gifs WHERE id = <ИДЕНТИФИКАТОР>


Приведение к типу
Часто в SQL запросе ожидается использование числовых значений.
В этом случае имеет смысл принудительно привести значение 

к числовому типу.

DELETE * FROM gifs WHERE id = <ИДЕНТИФИКАТОР>

<?php
$id = intval($_GET['id']);

$sql = 'DELETE * FROM gifs WHERE `id` = ' . $id;
Приведение к типу
Часто в SQL запросе ожидается использование числовых значений.
В этом случае имеет смысл принудительно привести значение 

к числовому типу.

DELETE * FROM gifs WHERE id = <ИДЕНТИФИКАТОР>

Приводим значение к числу

<?php
$id = intval($_GET['id']);

$sql = 'DELETE * FROM gifs WHERE `id` = ' . $id;
Экранирование данных
Экранирование заменяет все «опасные» символы в строке на 

их «безопасные» аналоги.
Опасные символы – это, в первую очередь, кавычки.
Экранирование данных
Экранирование заменяет все «опасные» символы в строке на 

их «безопасные» аналоги.
Опасные символы – это, в первую очередь, кавычки.

Без экранирования

INSERT INTO categories (text) VALUES ('Я - Д'артаньян')


Экранирование данных
Экранирование заменяет все «опасные» символы в строке на 

их «безопасные» аналоги.
Опасные символы – это, в первую очередь, кавычки.

Без экранирования

INSERT INTO categories (text) VALUES ('Я - Д'артаньян')

После экранирования

INSERT INTO categories (text) VALUES ('Я – Д\'артаньян')


Экранирование данных
Используйте функцию mysqli_real_escape_string()
для обработки значений в SQL запросах

$con = mysqli_connect("localhost", "root", "","giftube");



$safe_email = mysqli_real_escape_string($con, $_POST['email']);

$sql = "INSERT INTO users
SET `email` = 'user@ml.ru', `password` = '$safe_email'";

$result = mysqli_query($con, $sql);


Подготовленные выражения
способ отделить логику SQL-запроса от данных в
нём
Проблема традиционного подхода
SQL-инъекции возможны из за динамического формирования 

запроса на основе данных от пользователя.
Если отправлять значения отдельно от запроса, то 

инъекция будет невозможна.
Проблема традиционного подхода
SQL-инъекции возможны из за динамического формирования 

запроса на основе данных от пользователя.
Если отправлять значения отдельно от запроса, то 

инъекция будет невозможна.

DELETE FROM gifs WHERE id = '2'


Проблема традиционного подхода
SQL-инъекции возможны из за динамического формирования 

запроса на основе данных от пользователя.
Если отправлять значения отдельно от запроса, то 

инъекция будет невозможна.

DELETE FROM gifs WHERE id = '2'

Логика запроса
Проблема традиционного подхода
SQL-инъекции возможны из за динамического формирования 

запроса на основе данных от пользователя.
Если отправлять значения отдельно от запроса, то 

инъекция будет невозможна.

DELETE FROM gifs WHERE id = '2'

Логика запроса Значение в запросе


Разделение кода и данных в запросе
Разделение кода и данных в запросе
Формируем SQL запрос

INSERT INTO users (email, name) VALUES (?, ?)


Разделение кода и данных в запросе
Формируем SQL запрос
вместо значений - плейсхолдеры

INSERT INTO users (email, name) VALUES (?, ?)


Разделение кода и данных в запросе
Формируем SQL запрос
вместо значений - плейсхолдеры

INSERT INTO users (email, name) VALUES (?, ?)

Готовим данные

$email = $_POST['email'];
$name = $_POST['name'];
Последовательность исполнения
Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами
Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами

Отправить запрос в MySQL


Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами

Отправить запрос в MySQL

Подставить значения в подготовленное


выражение
Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами

Отправить запрос в MySQL

Подставить значения в подготовленное


выражение

Выполнить подготовленное выражение


Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами

Отправить запрос в MySQL

Подставить значения в подготовленное


выражение

Выполнить подготовленное выражение

Обработать результат выполнения запроса


Подготовленные выражения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

$name = $_POST['name'];
$email = $_POST['email'];

$sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);

mysqli_stmt_execute($stmt);
Подготовленные выражения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

SQL-запрос с плейсхолдерами

$name = $_POST['name'];
$email = $_POST['email']; вместо значений

$sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);

mysqli_stmt_execute($stmt);
Подготовленные выражения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

SQL-запрос с плейсхолдерами

$name = $_POST['name'];
$email = $_POST['email']; вместо значений

$sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = mysqli_prepare($con, $sql); Подготавливаем выражение
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);

mysqli_stmt_execute($stmt);
Подготовленные выражения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

SQL-запрос с плейсхолдерами

$name = $_POST['name'];
$email = $_POST['email']; вместо значений

$sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = mysqli_prepare($con, $sql); Подготавливаем выражение
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);

mysqli_stmt_execute($stmt); Передаем в выражение

значения от пользователя
Подготовленные выражения

<?php
$con = mysqli_connect("localhost", "root", "", "giftube");

SQL-запрос с плейсхолдерами

$name = $_POST['name'];
$email = $_POST['email']; вместо значений

$sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
$stmt = mysqli_prepare($con, $sql); Подготавливаем выражение
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);

mysqli_stmt_execute($stmt); Передаем в выражение

значения от пользователя

Выполняем выражение
Помощник для подготовленных выражений
Для упрощения работы с подготовленными выражениями в 

вашем проекте есть специальная функция-помощник -
db_get_prepare_stmt
Помощник для подготовленных выражений
Для упрощения работы с подготовленными выражениями в 

вашем проекте есть специальная функция-помощник -
db_get_prepare_stmt

Принимает:
ресурс соединения, sql запрос и массив со значениями
Помощник для подготовленных выражений
Для упрощения работы с подготовленными выражениями в 

вашем проекте есть специальная функция-помощник -
db_get_prepare_stmt

Принимает:
ресурс соединения, sql запрос и массив со значениями

Возвращает:
подготовленное выражение с добавленными туда значениями, 

которое останется только выполнить и получить результат
Как получить объект результата
Чтобы получить объект результата после выполнения

подготовленного выражения используйте функцию 

mysqli_stmt_get_result
Как получить объект результата
Чтобы получить объект результата после выполнения

подготовленного выражения используйте функцию 

mysqli_stmt_get_result

$sql = "SELECT * FROM gifs WHERE id = ?";


$res = mysqli_prepare($link, $sql);
$stmt = db_get_prepare_stmt($link, $sql, [$_GET['id']]);
mysqli_stmt_execute($stmt);
$res = mysqli_stmt_get_result($stmt);
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC);
Разобранные критерии
Б18 

В коде отсутствуют SQL инъекции

https://up.htmlacademy.ru/php/4/criteries

Вам также может понравиться