Академический Документы
Профессиональный Документы
Культура Документы
Lesson 07
Lesson 07
MySQL и PHP
План вебинара
План вебинара
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
Сформировать SQL-запрос
Схема работы с MySQL
Сформировать SQL-запрос
Выполнить SQL-запрос
Схема работы с MySQL
Сформировать SQL-запрос
Выполнить SQL-запрос
Получить ресурс
соединения
нет Соединение
успешно?
Показать ошибку
Сформировать SQL запрос
нет Результат да
успешен?
Итерация по полученным
результатам
Подключение к MySQL
В PHP сценарии перед выполнением любых SQL запросов необходимо
установить подключение к MySQL
Подключение к MySQL
В PHP сценарии перед выполнением любых SQL запросов необходимо
установить подключение к MySQL
Синтаксис
Синтаксис
Использование
<?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
Чтение
• Оператор - SELECT
Два вида запросов
Чтение Модификация
Пример
<?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);
Ресурс соединения
Обработка ошибок
Результат выполнения запроса может завершиться ошибкой
Обработка ошибок
Результат выполнения запроса может завершиться ошибкой
Пример
<?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);
}
Пример
<?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);
}
Последовательность исполнения:
1. Формирование SQL запроса
2. Выполнение запроса
3. Получение объекта результата
4. Преобразование объекта результата
в двумерный массив
Объект результата
Объект результата – это результат выполнения функции
mysqli_query при работе с запросами типа SELECT
Объект результата
Объект результата – это результат выполнения функции
mysqli_query при работе с запросами типа SELECT
БД
Данные ОР Объект результата
$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']);
}
Преобразуем объект результата
в двумерный массив с записями
Получение записей в виде массива
Из объекта результата полученные из БД записи можно
преобразовать в привычный, двумерный массив
Получение записей в виде массива
Из объекта результата полученные из БД записи можно
преобразовать в привычный, двумерный массив
$rows = [
['id'
=> 1, 'name'
=> 'frexin'],
['id'
=> 2, 'name'
=> 'timon'],
['id'
=> 3, 'name'
=> 'daredevil'],
];
Как получить одну запись
Для получения единственной записи из результатов запроса
в виде ассоциативного массива есть функция mysqli_fetch_assoc
Как получить одну запись
Для получения единственной записи из результатов запроса
в виде ассоциативного массива есть функция mysqli_fetch_assoc
$row =
['id'
=> 1, 'name'
=> 'frexin'];
Получение количества записей
Количество записей – это сколько записей всего вернет
выполненный SQL запрос на чтение
Пример
<?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);
Логика запроса
Смешивание кода и данных
SQL-запросы могут формироваться динамически и включать
в себя данные от пользователя. Например:
1. Добавление в БД информации из формы
2. Подстановка параметра из URL
<?php
$con = mysqli_connect("localhost", "root", "","giftube");
$id = $_GET['id'];
/del.php?id=2' OR 1=1
--
Пример уязвимости
Запрос хакера
/del.php?id=2' OR 1=1 --
Итоговый SQL
/del.php?id=2' OR 1=1 --
Итоговый SQL
/del.php?id=2' OR 1=1 --
Итоговый SQL
<?php
$id = intval($_GET['id']);
$sql = 'DELETE * FROM gifs WHERE `id` = ' . $id;
Приведение к типу
Часто в SQL запросе ожидается использование числовых значений.
В этом случае имеет смысл принудительно привести значение
к числовому типу.
<?php
$id = intval($_GET['id']);
$sql = 'DELETE * FROM gifs WHERE `id` = ' . $id;
Экранирование данных
Экранирование заменяет все «опасные» символы в строке на
их «безопасные» аналоги.
Опасные символы – это, в первую очередь, кавычки.
Экранирование данных
Экранирование заменяет все «опасные» символы в строке на
их «безопасные» аналоги.
Опасные символы – это, в первую очередь, кавычки.
Без экранирования
Без экранирования
После экранирования
Логика запроса
Проблема традиционного подхода
SQL-инъекции возможны из за динамического формирования
запроса на основе данных от пользователя.
Если отправлять значения отдельно от запроса, то
инъекция будет невозможна.
Готовим данные
$email = $_POST['email'];
$name = $_POST['name'];
Последовательность исполнения
Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами
Последовательность исполнения
Сформировать SQL запрос с
плейсхолдерами
<?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
https://up.htmlacademy.ru/php/4/criteries