MySQLi: новая разработка в PHP

Перестанет ли PHP поддерживать MySQL в ближайшее время? Этот вопрос занимает умы членов PHP-сообщества с тех пор, как при подключении к серверу MySQL через старое расширение mysql стало появляться сообщение об ошибке, рекомендующее перейти на ext/mysqli. Это уведомление об устаревании появилось еще в PHP 5.5, в то время как расширение mysqli было впервые представлено в PHP 5.0. Напомню, что это было в 2004 году.

Но откуда взялось это чувство неопределенности? Команда PHP в Oracle, должно быть, поняла, что многие все еще используют ext/mysql, включая таких тяжеловесов индустрии, как WordPress. Поэтому Oracle решила начать медленный процесс депривации. Однако всему когда-то приходит конец, поэтому расширение mysql было удалено с выходом PHP 7. В этой статье мы подробно и с примерами представим преемника MySQLi и обсудим, чем отличаются эти два расширения.

Что такое MySQLi?

MySQLi — это улучшенное расширение (символ -i означает «улучшенный») PHP для доступа к базам данных MySQL. MySQL — одна из самых популярных в мире систем управления реляционными базами данных (СУБД), наряду с Oracle и Microsoft SQL Server. Реляционные базы данных являются основной частью Интернета, поскольку они позволяют обрабатывать и хранить большие объемы данных в долгосрочной перспективе. Это предполагает разбиение сложных наборов данных на подмножества и размещение их друг относительно друга по мере необходимости.

Разработанное в 1994 году шведской компанией MySQL AB, это программное обеспечение в настоящее время распространяется корпорацией Oracle по системе двойного лицензирования. В дополнение к собственной версии Enterprise Edition, Oracle предлагает версию с открытым исходным кодом под лицензией GPL. Такое двойное лицензирование позволяет компаниям разрабатывать собственные приложения на основе MySQL без привязки к лицензии.

Что включает в себя расширение mysqli?

Существует три различных способа доступа к базе данных MySQL. Самый старый из них использует расширение MySQL, которое было устаревшим начиная с PHP 5.5 и полностью удалено в PHP 7. Функция mysql() больше не работает в PHP 7. Она была заменена на mysqli().

Помимо старого расширения mysql, доступ к базам данных MySQL в PHP можно получить с помощью расширения PHP Data Objects (PDO), которое особенно многогранно в своем использовании. Третий способ использует расширение MySQL Improved Extension. Начиная с PHP 5, для доступа к базам данных MySQL можно использовать расширение mysqli. Следующий фрагмент кода является примером PHP MySQLi.

Фрагмент кода: отправка SQL-запроса к базе данных

Метод query($sql) используется для отправки запросов к базе данных:

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
    die("Connect Error: " . $mysqli->connect_error);
}

$sql = "UPDATE table SET column = 'value' WHERE id = 1";
$mysqli->query($sql);
?>

Каковы преимущества использования MySQLi?

В отличие от своего предшественника, расширение mysqli использует как процедурный, так и объектно-ориентированный подход. Одним из преимуществ объектно-ориентированного программирования является то, что после написания кода его можно легко поддерживать и изменять в будущем. Например, можно создавать новые классы, которые наследуют свойства и поведение от существующих классов. Это значительно сокращает время разработки и облегчает адаптацию программы к изменяющейся среде или новым требованиям.

Еще одним важным преимуществом MySQLi является использование подготовленных операторов. Подготовленный оператор — это шаблон оператора для системы баз данных. В отличие от обычных операторов, они содержат заполнители вместо значений параметров. Если оператор должен быть выполнен несколько раз (например, внутри цикла) в системе баз данных с различными параметрами, использование подготовленных операторов может увеличить скорость, поскольку оператор уже предварительно переведен в систему баз данных и должен быть выполнен только с новыми параметрами. Кроме того, подготовленные операторы могут эффективно предотвращать SQL-инъекции, поскольку система баз данных проверяет достоверность параметров перед их обработкой.

Фрагмент кода: подготовленные операторы в MySQLi

Ниже приведен пример подготовленного оператора в MySQLi:

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
    die("Connect Error: " . $mysqli->connect_error);
}
$sql = "UPDATE user SET email = ?, password = ? WHERE id = ?";
$statement = $mysqli->prepare($sql);
$statement->bind_param('ssi', $email, $password, $id);

//Assign values to variables
$id= 1;
$email = "an@example.com";
$password = "new password";
$statement->execute();
?>

С помощью bind_param() параметры в SQL-запросе привязываются к переменным. В приведенном примере первым аргументом функции bind_param() является ssi. Этот аргумент описывает типы параметров. Аргумент ssi указывает, что в запросе три параметра: первый тип — строка, второй — также строка, а третий — целое число. Значение d по-прежнему существует для целых чисел с плавающей точкой.

После того как параметры привязаны к переменным, им присваиваются соответствующие значения, и подготовленный запрос отправляется в базу данных с помощью $statement->execute(). По сравнению с PDO это намного сложнее.

mysqli() против mysql(): почему была изменена функция PHP?

Переход на MySQLi был неизбежен, потому что старое расширение mysql просто устарело. Кроме того, обратная совместимость всегда была приоритетом для расширения, что затрудняло поддержку кода. Код относится к раннему периоду развития PHP и MySQL, и в некоторых аспектах он не был оптимальным.

Например, если идентификатор соединения не был определен явно, все функции будут пытаться использовать последний указанный идентификатор. Очень невезучие пользователи могли даже обнаружить, что mysql_query() обращается к совершенно другой базе данных. В старой функции идентификатор соединения был необязательным, но в новом расширении он обязателен. Кроме того, были добавлены подготовленные операторы, чтобы сделать получение данных из таблицы базы данных более быстрым и безопасным.

Удобно, что многие функции можно изменить, просто добавив -i к функции mysql(). Однако между двумя расширениями есть и некоторые различия.

Фрагмент кода: идентификаторы соединения в MySQL и MySQLi

Некоторые функции mysqli() требуют идентификатор соединения — переменную PHP, создаваемую при подключении к базе данных. В данном примере она называется $link.

<?php
// mysql() to establish a connection:
mysql_connect("localhost", "root", "", "test");

// mysqli() to establish a connection:
$link = mysqli_connect("localhost", "root", "", "test");
?>

Фрагмент кода: получение данных из таблицы базы данных

Функция mysqli_query() требует идентификатор соединения, однако функция mysqli_fetch_array() этого не делает.

<?php
$link = mysqli_connect("localhost", "root", "", "test");

// Retrieve data sets:
$datasets = mysqli_query($link,
 "SELECT `name`, 'text', 'date' FROM 'messages'");

// Output data sets:
while (list($name, $text, $date) = mysqli_fetch_array($dataset)) {
echo "<p>$name - $title - $text - $date</p>";
}
?>

Помимо ранее упомянутой функции, следующие функции также требуют идентификатор соединения:

  • mysqli_set_charset()
  • mysqli_real_escape_string()
  • mysqli_insert_id()

Заключение: MySQLi быстрее и безопаснее

Переход на MySQLi был необходим для повышения скорости доступа к базам данных. В новом расширении были введены подготовленные операторы, которые также повышают безопасность соединения, поскольку могут предотвратить SQL-инъекции. Перед обработкой параметров система базы данных проверяет, являются ли они действительными. Кроме того, новый код легче поддерживать благодаря объектно-ориентированному подходу.

Оцените статью
cdelat.ru
Добавить комментарий