Основы PHP: Работа с MySQL (mysqli)
mysqli_ — это расширение PHP, разработанное для обеспечения доступа к базам данных MySQL, начиная с версии 4.1.13 и новее. Оно предлагает ряд преимуществ по сравнению с устаревшим расширением mysql_, включая поддержку подготовленных запросов, улучшенную безопасность и расширенные возможности.
Важно: Хотя mysqli_ является улучшением по сравнению с mysql_, PDO по-прежнему рекомендуется для новых проектов из-за его абстрактного уровня доступа к данным, что облегчает переключение между различными СУБД.
Подключение к серверу MySQL
Первым шагом является установление соединения с сервером MySQL с помощью функции mysqli_connect().
<?php
$host = 'localhost';
$user = 'myuser';
$password = 'mypassword';
$database = 'mydatabase';
$conn = mysqli_connect($host, $user, $password, $database);
// Проверка соединения
if (!$conn) {
die("Ошибка подключения к MySQL: " . mysqli_connect_error());
}
echo "Успешно подключено к MySQL!\n";
// Не забудьте закрыть соединение в конце скрипта: mysqli_close($conn);
?>mysqli_connect($host, $user, $password, $database): Пытается установить соединение с сервером MySQL. Возвращает объект соединения (mysqli) в случае успеха илиfalseв случае ошибки.mysqli_connect_error(): Возвращает строку с описанием последней ошибки подключения, если таковая была.die(): Выводит сообщение и завершает выполнение текущего скрипта.mysqli_close($conn): Закрывает установленное соединение с сервером MySQL. Рекомендуется закрывать соединение после завершения работы с базой данных для освобождения ресурсов.
Выполнение SQL-запросов
После установления соединения вы можете выполнять SQL-запросы с помощью функции mysqli_query().
Выполнение простых запросов
<?php
// ... (код подключения) ...
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);
if ($result) {
// Получение количества строк в результате
$row_count = mysqli_num_rows($result);
echo "Найдено " . $row_count . " пользователей:\n";
// Извлечение результатов
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row['id'] . ", Имя: " . $row['name'] . ", Email: " . $row['email'] . "\n";
}
// Освобождение результирующего набора
mysqli_free_result($result);
} else {
echo "Ошибка выполнения запроса: " . mysqli_error($conn) . "\n";
}
mysqli_close($conn);
?>mysqli_query($conn, $sql): Выполняет SQL-запрос на сервере, используя установленное соединение$conn. Возвращает объект результата (mysqli_result) в случае успешного выполненияSELECT,SHOW,DESCRIBEилиEXPLAINзапросов,trueдля других успешных запросов (INSERT,UPDATE,DELETE) илиfalseв случае ошибки.mysqli_num_rows($result): Возвращает количество строк в результирующем наборе (mysqli_result). Используется только дляSELECTзапросов.mysqli_fetch_assoc($result): Извлекает одну строку результата в виде ассоциативного массива (где ключами являются имена столбцов). Существуют такжеmysqli_fetch_row()(числовой массив) иmysqli_fetch_array()(ассоциативный и числовой массив).mysqli_free_result($result): Освобождает память, занятую результирующим набором. Рекомендуется делать это после обработки всех строк.mysqli_error($conn): Возвращает строку с описанием последней ошибки, возникшей при выполнении MySQL-запроса для указанного соединения.
Подготовленные запросы (mysqli_prepare(), mysqli_stmt_bind_param(), mysqli_stmt_execute(), mysqli_stmt_get_result())
Как и в PDO, подготовленные запросы в mysqli_ являются важным инструментом для безопасной работы с базами данных, особенно при обработке пользовательского ввода.
<?php
// ... (код подключения) ...
$sql = "SELECT id, name FROM users WHERE email = ?";
$stmt = mysqli_prepare($conn, $sql);
if ($stmt) {
$email = 'john.doe@example.com';
// Привязка параметров к подготовленному запросу
mysqli_stmt_bind_param($stmt, 's', $email); // 's' означает string, 'i' - integer, 'd' - double, 'b' - blob
// Выполнение подготовленного запроса
mysqli_stmt_execute($stmt);
// Получение результата
$result = mysqli_stmt_get_result($stmt);
if ($result) {
if ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row['id'] . ", Имя: " . $row['name'] . "\n";
} else {
echo "Пользователь с таким email не найден.\n";
}
mysqli_free_result($result);
} else {
echo "Ошибка получения результата: " . mysqli_stmt_error($stmt) . "\n";
}
// Закрытие подготовленного запроса
mysqli_stmt_close($stmt);
} else {
echo "Ошибка подготовки запроса: " . mysqli_error($conn) . "\n";
}
mysqli_close($conn);
?>mysqli_prepare($conn, $sql): Подготавливает SQL-запрос к выполнению. Запрос может содержать анонимные плейсхолдеры (?). Возвращает объект подготовленного запроса (mysqli_stmt) в случае успеха илиfalseв случае ошибки.mysqli_stmt_bind_param($stmt, $types, ...$vars): Связывает переменные с плейсхолдерами в подготовленном запросе.$types— это строка, содержащая типы данных для каждого параметра ('s' для string, 'i' для integer, 'd' для double, 'b' для blob).mysqli_stmt_execute($stmt): Выполняет подготовленный запрос. Возвращаетtrueв случае успеха илиfalseв случае ошибки.mysqli_stmt_get_result($stmt): Получает результирующий набор из выполненного подготовленного запросаSELECT. Возвращает объект результата (mysqli_result) илиfalseв случае ошибки.mysqli_stmt_error($stmt): Возвращает строку с описанием последней ошибки, возникшей при работе с подготовленным запросом.mysqli_stmt_close($stmt): Закрывает подготовленный запрос.
Выполнение запросов на вставку, обновление и удаление данных с использованием подготовленных запросов
<?php
// ... (код подключения) ...
// Вставка данных
$sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($conn, $sql);
if ($stmt) {
$name = 'Jane Doe';
$email = 'jane.doe@example.com';
$age = 28;
mysqli_stmt_bind_param($stmt, 'ssi', $name, $email, $age);
mysqli_stmt_execute($stmt);
$affected_rows = mysqli_stmt_affected_rows($stmt);
$last_insert_id = mysqli_insert_id($conn);
echo "Добавлено " . $affected_rows . " записей, ID последней записи: " . $last_insert_id . "\n";
mysqli_stmt_close($stmt);
}
// Обновление данных
$sql = "UPDATE users SET age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
if ($stmt) {
$new_age = 30;
$id = 1;
mysqli_stmt_bind_param($stmt, 'ii', $new_age, $id);
mysqli_stmt_execute($stmt);
$affected_rows = mysqli_stmt_affected_rows($stmt);
echo "Обновлено " . $affected_rows . " записей.\n";
mysqli_stmt_close($stmt);
}
// Удаление данных
$sql = "DELETE FROM users WHERE email = ?";
$stmt = mysqli_prepare($conn, $sql);
if ($stmt) {
$email_to_delete = 'jane.doe@example.com';
mysqli_stmt_bind_param($stmt, 's', $email_to_delete);
mysqli_stmt_execute($stmt);
$affected_rows = mysqli_stmt_affected_rows($stmt);
echo "Удалено " . $affected_rows . " записей.\n";
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
?>mysqli_stmt_affected_rows($stmt): Возвращает количество строк, затронутых последним запросомINSERT,UPDATEилиDELETE, выполненным подготовленным запросом.mysqli_insert_id($conn): Возвращает ID последней вставленной строки для указанного соединения.
Обработка ошибок
При работе с mysqli_, ошибки обычно проверяются после каждой операции. Функции, такие как mysqli_error() и mysqli_stmt_error(), возвращают описание последней ошибки. Рекомендуется всегда проверять результат выполнения SQL-запросов и обрабатывать ошибки соответствующим образом.
Транзакции
mysqli_ также поддерживает транзакции.
<?php
// ... (код подключения) ...
mysqli_begin_transaction($conn);
try {
// Выполнение нескольких запросов
mysqli_query($conn, "UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
mysqli_query($conn, "UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
// Фиксация транзакции
mysqli_commit($conn);
echo "Транзакция успешно выполнена.\n";
} catch (Exception $e) {
// Откат транзакции в случае ошибки
mysqli_rollback($conn);
echo "Ошибка транзакции: " . mysqli_error($conn) . "\n";
}
mysqli_close($conn);
?>mysqli_begin_transaction($conn): Начинает новую транзакцию.mysqli_commit($conn): Фиксирует транзакцию.mysqli_rollback($conn): Откатывает транзакцию.
Закрытие соединения
После завершения работы с базой данных обязательно закройте соединение с помощью mysqli_close($conn).
Хотя mysqli_ предоставляет более безопасный и функциональный способ работы с MySQL по сравнению с mysql_, помните, что PDO предлагает еще более высокий уровень абстракции и переносимости между различными СУБД. Для новых проектов рекомендуется рассмотреть использование PDO.