Что такое mysqli
mysqli — расширение PHP с интерфейсом для взаимодействия с базами данных MySQL. Аббревиатура расшифровывается как MySQL Improved. Название указывает на более широкие возможности по сравнению с предшественником — расширением mysql. В нем есть объектно-ориентированный и процедурный интерфейсы: это сочетание позволяет разработчикам свободно выбирать стиль программирования.
Важное преимущество mysqli — поддержка подготовленных запросов (prepared statements) для защиты от SQL-инъекций. Это лишает злоумышленников возможности внедрить вредоносный SQL-код. В старом mysql защита от инъекций требовала большей внимательности от разработчиков.
В mysqli представлен расширенный набор функций для работы с MySQL, в частности:
- возможность управления транзакциями;
- более гибкая работа с результатами запросов;
- поддержка многозапросных операций;
- поддержка разных типов подключений к MySQL, в том числе TCP/IP и сокетов Unix.
Функции процедурного стиля можно вызывать для выполнения операций с базой данных. Все они имеют префикс mysqli_ (mysqli_connect(), mysqli_query(), mysqli_fetch_array().
Объектно-ориентированный интерфейс предлагает более структурированный подход. В его рамках операции с базой данных выполняются через вызов методов объекта mysqli, например $mysqli->connect(), $mysqli->query(), $mysqli->fetch_array().
Выбор подхода зависит от привычного для конкретного разработчика стиля программирования.
В отличие от PDO, совместимого с разными базами данных, mysqli ориентирован исключительно на MySQL. Это может быть и плюсом (более тесная интеграция с конкретной СУБД), и минусом (несовместимость с другими решениями)
Работа через интерфейс способствует безопасности разработки. Можно свободно выбирать стиль программирования в рамках проектов, ориентированных только на MySQL.
Связь с базами данных MySQL из PHP
Работа с MySQL из PHP всегда начинается с установки соединения. Это можно сделать несколькими способами:
- mysqli_connect() (в процедурном стиле);
- через создание объекта класса mysqli (в объектно-ориентированном стиле).
В любом из вариантов нужно указать параметры подключения: хост, имя пользователя, пароль, имя базы данных.
Следующий этап — отправка запросов к базе данных. Для этого есть функция mysqli_query() (процедурный стиль) или метод query() объекта mysqli (объектно-ориентированный стиль).
Для запросов с пользовательскими данными подходят подготовленные запросы (prepared statements). Они защищают систему от SQL-инъекций, создаются с помощью методов mysqli_prepare() и mysqli_stmt_bind_param(), а выполняются через mysqli_stmt_execute().
Результаты можно получить с помощью разных функций и методов:
- в процедурном стиле — mysqli_fetch_array(), mysqli_fetch_assoc(), mysqli_fetch_object();
- в объектно-ориентированном стиле — через методы объекта mysqli_result.
Выбор подходящего метода зависит от дальнейшего использования данных.
В mysqli есть инструменты для управления транзакциями: mysqli_autocommit(), mysqli_begin_transaction(), mysqli_commit() и mysqli_rollback(). С ними можно сгруппировать несколько запросов в одну операцию. В таком случае либо все запросы транзакции выполняются успешно, либо все они откатываются: данные остаются целостными.
Ненужные соединения обязательно надо вовремя закрывать. Это можно сделать с помощью функции mysqli_close() в процедурном стиле или метода close() объекта mysqli — в объектно-ориентированном. Это нужно, чтобы высвободить ресурсы на сервере и повысить производительность сервиса.
Подключение к базе данных
Чтобы PHP работал с MySQL, нужно подключиться к базе данных одним из двух способов.
Процедурный стиль: mysqli_connect("хост", "пользователь", "пароль", "база_данных").
Объектный стиль: new mysqli("хост", "пользователь", "пароль", "база_данных").
Ошибки подключения проверяют с помощью mysqli_connect_errno()/connect_errno и mysqli_connect_error()/connect_error (для процедурного и объектного стилей соответственно).
Сразу после подключения можно отправлять запросы. Важно настроить соединение, например, установить кодировку с помощью mysqli_set_charset().
Параметры подключения лучше вынести в отдельный файл. Так удобнее менять их в разных средах.
Функция mysqli_connect()
Функция mysqli_connect() лежит в основе любого PHP-приложения, взаимодействующего с MySQL в процедурном стиле. Она принимает несколько параметров, а возвращает либо ресурс соединения, либо параметр false (если возникла ошибка).
Синтаксис функции выглядит так: mysqli_connect(host, username, password, database, port, socket).
- host — имя хоста или IP-адрес сервера MySQL;
- username — имя пользователя для доступа к базе данных;
- password — пароль пользователя;
- database — имя базы данных, к которой необходимо подключиться.
Параметры port и socket не обязательны. Первый — номер порта, по которому работает MySQL (по умолчанию 3306), второй — путь к сокету Unix, если система использует сокетное соединение.
После вызова важно проверить успешность соединения с помощью функции mysqli_connect_errno(). Она выдает числовой код ошибки, при успешном соединении — 0. Для диагностики проблем можно получить текстовое описание ошибки через mysqli_connect_error().
$host = "localhost";
$username = "my_user";
$password = "my_password";
$database = "my_database";
$connection = mysqli_connect($host, $username, $password, $database);
if (mysqli_connect_errno()) {
echo "Ошибка: " . mysqli_connect_error();
exit();
}
echo "Соединение установлено!";
mysqli_close($connection);
После подключения к базе система проверяется на наличие ошибок. Если есть ошибки, скрипт завершается.
Сама по себе функция connect() не подвержена SQL-инъекциям. Но неправильное использование переменных может привести к уязвимостям. Поэтому параметры подключения желательно хранить в конфигурационном файле или использовать переменные окружения.
Установка кодировки
Правильная кодировка устанавливается через функцию mysqli_set_charset(). Чаще всего используется UTF-8. Если не установить кодировку, система использует значение по умолчанию, а оно подходит не для всех приложений. Символы могут искажаться, текстовые данные — не читаться.
$connection = mysqli_connect("localhost", "my_user", "my_password", "my_database");
if (!$connection) {
die("Ошибка подключения: " . mysqli_connect_error());
}
if (!mysqli_set_charset($connection, "utf8")) {
echo "Ошибка кодировки: " . mysqli_error($connection);
} else {
echo "utf8.";
}
mysqli_close($connection);
Правильная кодировка соединения нужна для корректной работы с текстовыми данными в приложениях.
Проверка соединения
Когда у вас получится установить соединение с базой данных MySQL из PHP, важно проверить его на корректность. Если этого не сделать, в будущем могут вылезти ошибки. Эта процедура — не формальность, а полноценная мера безопасности.
Для проверки соединения используются две функции: mysqli_connect_errno() и mysqli_connect_error(). Первая возвращает целочисленный код ошибки. Если возникли проблемы, появляется отличное от нуля число, если все хорошо — 0.
Функция mysqli_connect_error() возвращает текстовое описание ошибки. Эти сообщения важно читать, чтобы понимать причины проблем и диагностировать их максимально точно.
В объектно-ориентированном стиле соединение проверяется через свойства объекта mysqli: connect_errno и connect_error. Первое свойство содержит число, второе — текст.
$connection = mysqli_connect("localhost", "my_user", "my_password", "my_database");
if (mysqli_connect_errno()) {
echo "Ошибка подключения (" . mysqli_connect_errno() . "): " . mysqli_connect_error();
exit();
} else {
echo "Соединение установлено успешно!";
}
Сначала система пытается установить соединение, потом проверяет числовой код ошибки. Если он не равен нулю, выводится сообщение об ошибке, с кодом и текстом. Если нет, соединение было установлено успешно, о чем тоже выводится сообщение.
Проверка соединения — обязательный шаг при взаимодействии PHP с MySQL. Нужно корректно обрабатывать ошибки, чтобы приложение работало надежно. Если игнорировать этот шаг, число проблем будет только расти.
Выполнение запросов
Готовый SQL-запрос выполняется с помощью функции mysqli_query(). Он отправляется на сервер MySQL, который уже возвращает результат.
Для SELECT-запроса нужно обработать возвращенные данные. Результат обычно возвращается в виде массива или объекта.)
Связанные параметры защищают запросы от SQL-инъекций. Вместо непосредственной вставки данных используются плейсхолдеры. Затем они заполняются значениями через специальные функции. Это делает код безопаснее и эффективнее.
Важно предусмотреть обработку возможных ошибок, которые могут возникнуть при выполнении запросов. Это может быть ошибка соединения, синтаксиса SQL или отсутствия данных. Проверка помогает предотвратить неожиданное поведение программы.
При выполнении сложных операций, включающих несколько запросов к базе данных, рекомендуется использовать транзакции. Они гарантируют целостность данных. Если хотя бы один запрос в транзакции завершится неудачно, все изменения отменяются (roll back).
Для упрощения работы с базами данных и повышения производительности, можно использовать ORM (Object-Relational Mapping), такие как Doctrine или Eloquent. ORM позволяют работать с данными как с объектами, абстрагируясь от конкретного SQL-синтаксиса. Это облегчает разработку и обслуживание приложений, но требует обучения.
Добавление и чтение записей
Опишем процесс добавления и чтения записей в MySQL при помощи PHP.
1. Взаимодействие с базой. PHP предоставляет несколько способов связи с MySQL, основные — расширения mysqli и PDO. Выбор конкретного метода зависит от предпочтений разработчика и требований проекта, но оба обеспечивают необходимую функциональность для работы с данными.
2. Подготовка данных для вставки (INSERT). Перед добавлением записи в MySQL PHP-скрипт должен получить данные для новой строки. Это могут быть пользовательский ввод из формы, данные, полученные из другого источника, или заранее определенные значения. Важно проверить данные на корректность и очистить от потенциально вредоносного кода, прежде чем использовать их в SQL-запросе.
3. Построение динамических INSERT-запросов. В зависимости от данных, которые нужно добавить, SQL-запросы INSERT могут формироваться динамически. Это означает, что PHP-скрипт конструирует запрос на основе переменных. При таком подходе важно избегать прямого внедрения переменных, чтобы предотвратить SQL-инъекции. Использование подготовленных выражений с параметрами — безопасная практика.
4. Получение ID добавленной записи. После успешного выполнения INSERT-запроса иногда надо получить ID (идентификатор) вновь созданной записи, особенно если он был сгенерирован автоматически (например, автоинкрементным полем).
5. Разнообразие SELECT-запросов. Запросы SELECT в MySQL могут быть простыми, когда нужно выбрать все строки из таблицы, и сложными, когда требуются процедуры фильтрации, сортировки, группировки, объединения данных из нескольких таблиц. PHP-скрипт должен уметь формировать такие запросы в зависимости от потребностей приложения.
6. Фетчинг с результирующими наборами. Полученные данные представляют собой набор строк, которые нужно обработать. Методы извлечения данных, такие как fetch(), fetchAll(), fetch_assoc(), позволяют итерироваться по этим строкам, использовать полученную информацию в PHP-коде.
7. Инкапсуляция запросов в функции и классы. Для улучшения структуры кода с упрощением его поддержки SQL-запросы и логика обработки результатов могут быть инкапсулированы в отдельные функции или классы. Такой подход позволяет отделить логику работы с базой данных от логики приложения, что делает код более гибким и масштабируемым.
8. Обработка специфичных для MySQL типов данных, среди которых текстовые, числовые, даты, временные отметки и бинарные. PHP-скрипт должен правильно обрабатывать эти типы при чтении и записи. Наглядный пример — форматирование даты и времени.
9. Иногда имеет смысл использовать хранимые процедуры (stored procedures) и представления (views) MySQL. Первые позволяют инкапсулировать сложную бизнес-логику на уровне базы данных, а представления упрощают доступ к часто используемым наборам данных. PHP-скрипт может вызывать хранимые процедуры, а также работать с представлениями как с обычными таблицами.
Виды запросов
Основные виды SQL-запросов, используемых в сочетании с PHP:
1. SELECT — на выборку данных из одной или нескольких таблиц. Может содержать условия (WHERE), сортировку (ORDER BY), ограничение количества результатов (LIMIT), группировку (GROUP BY) и объединения (JOIN). Используется для чтения данных из базы.
2. INSERT — на добавление новых записей в таблицу. Указывает имя таблицы и значения для каждого столбца. Используется для добавления новых данных.
3. UPDATE — на изменение существующих записей в таблице. Используется для обновления данных, соответствующих заданному условию (WHERE).
4. DELETE — на удаление записей из таблицы. Удаляет все записи или только те, которые соответствуют определенному условию (WHERE).
5. CREATE — на создание новых объектов в базе данных, таких как таблицы (TABLE), базы данных (DATABASE), индексы (INDEX), представления (VIEW) и хранимые процедуры (PROCEDURE).
6. ALTER — на изменение структуры существующих объектов.
7. DROP — на удаление объектов базы данных, таких как таблицы или индексы.
8. TRUNCATE — на быстрое удаление всех данных из таблицы, без возможности отмены и без удаления самой таблицы.
9. CALL — на вызов хранимых процедур или функций, определенных в базе данных.
Правильно составленные SQL-запросы влияют на производительность приложения. Использование индексов, выбор только необходимых столбцов, избегание циклов в SQL-запросах — все это помогает ускорить выполнение кода.