{INTRODUCTION}
Статья предназначена для web-программистов, имеющих опыт работы с
PHP и
MySQL.
Статья освещает основы работы с расширением
MySQLi.
Для работы нам понадобится сервер с установленным интерпритатором
PHP(c расширением
MySQLi), и базой данных
MySQL.
Для этого подойдет
WampServer (как с ним работать разберетесь сами).
{ABOUT EXTENSION}
Для начала обратимся к
Википедии:
MySQLi — это расширение PHP5, которое поддерживает новые возможности MySQL 4.1
Расширение было создано
Георгом Рихтером, для замены устаревшего расширения
ext/mysql(т.к стали появлятся противоречия с клиентской библиотекой
MySQL, да и протокол набо было бы обновить).
От себя добавлю: - Расширение просто в использовании
- Скорость работы с БД возрасла в более чем 40 раз
- Теперь о SQL-инъекциях можно забыть(это несомненный +)
Работать с
MySQLi очень удобно. Можно воспользоваться
базовым методом, т.е пользуясь обыкновенными функциями,
или же
объектно-ориентированным,
когда в работе применяются классы. В статье я буду рассматривать ООМ(объектно-ориентированный метод).
Я вас заинтересовал?! Давайте ознакомимся!
{Пример 1. Подключаемся к базе данных}
Для начала и последующей работы нам нужно подключится к БД.
Для этого нам потребуются:- логин пользователя БД
- пароль пользователя БД
- хост(обычно localhost) с БД
- База Данных(предварительно создайте базу в PhpMyadmin'е - mysqli).
- Таблица users, с колонками login и pass
Создать подключение очень просто:
PHP код:
<?php
$user = "root"; //Имя пользователя
$password = ""; //Пароль пользователя
$host = "localhost"; //Хост
$db = "mysqli"; //БД
$sql = new mysqli($host,$user,$password,$db) or die("Ошибка соединения с базой данных");
$sql->close();
?>
Переменная
$sql c классом
MySQLi отвечает за работу с БД. В пармаметрах инициализации, и происходит соединение.
Если инициализация класса пройдет неудачно, то функция вернет false. Причиной этому может быть неправильные логин/пароль или хост.
Поэтому я и использую конструкцию
"or die();", чтобы уведомить пользователя, что соединение с БД прошло неудачно.
Синтаксис последующих комманд будет выглядеть так:
PHP код:
$класс_mysqli->метод();
$класс_mysqli->переменная;
Т.е работаем как с любым
классом.
Метод
"close();" завершает соединение с БД.
{Пример 2. Выполняем запросы с заданными параметрами}
Я начну рассматривать
возможности сразу с
подготовленных запросов, т.к они являются главной "фишкой" в
расширении.
Плюсы подготовленных запросов:- Высокая скорость работы с БД
- Очень низкий расход траффика
- Высокая безопасность запросов(т.е становятся невозможными SQL-инъекции)
- И многое, многое другое.
Давайте для начала рассмотрим запросы с
заданными параметрами.
Эти запросы, используются в тех случаях, когда требуется что-либо
создать или
обновить в Базе данных.
Опишу общую схему работы таких запросов:
Создается
шаблон запроса, и посылается серверу. Сервер проверяет его
корректность, и если все прошло удачно, то
запоминает этот шаблон в своем буфере.
Потом отправляются
параметры к шаблону, для последующего выполнения. И возвращается булевое(
TRUE or
FALSE).
Нужно учесть несколько важных особенностей:- Тело шаблона отсылается серверу MySQL только один раз, но выполнять его можем большое количество раз, посылая разные параметры.
- Расширение автоматически представляет все операторы(SQL) в виде параметров, так что о SQL-инъекциях можно забыть.
Следовательно нам
не нужно фильтровать запрос разными функциями на подобие
"mysql_real_escape_string()". Расширение само оптимизирует запрос.
Шаблон запроса будет выглядеть так:
PHP код:
INSERT INTO table_name (name_coloumn1, name_colloumn2) VALUES (?, ?);
где знак вопроса будет местом для подстановки параметра.
Обратите внимание(я сам в этом месте поначалу ошибался):
знак вопроса не надо заключать в кавычки, т.к расширение вернет ошибку.
Создадим новую запись в БД:
PHP код:
<?php
$user = "root"; //Имя пользователя
$password = ""; //Пароль пользователя
$host = "localhost"; //Хост
$db = "mysqli"; //БД
$sql = new mysqli($host,$user,$password,$db) or die(mysqli_connect_error());
$stmt = $sql->prepare("INSERT INTO users(login,pass) VALUES (?,?)"); //Отправляем шаблон
$stmt->bind_param('ss', $l,$p); //Указываем параметры
$l = "Login"; //заполняем первый параметр
$p = "Password"; //заполняем второй параметр
$stmt->execute() or die("Предупреждение о неудачном запросе"); //Выполняем запрос
$stmt->close(); //Удаляем шаблон из памяти.
$sql->close(); //Закрываем соединение
?>
Рассмотрим все по порядку:
Сначала создается переменная
$stmt, которая имеет значение подготовленного шаблона.
Потом методом
"bind_param()" указывается тип каждого параметра(1 буква = один параметр), и назначаются переменные, которые позже будут в БД.
Приведу таблицу типов данных:
i- INT типы
d- DOUBLE и FLOAT
b- BLOB'ы
s- Строковые и остальные типы.
В параметрах запроса, мы указали, что данные являются строчными по содержанию.
Следующим шагом выполняется запрос методом
"execute()", вследствии которого создается в таблице users - новая строка со значениями, которые мы указали.(т.е Login, Password). Если же запрос завершится неудачно то метод вернет
FALSE.
Обратите внимание, что после этого запроса
мы обязаны отчистить буфер БД от шаблона, если мы его больше не будем использовать.
Это можно сделать методом
"close();"
Теперь можете поиграться с подстановкой кавычек), они проходят и записываются в БД, но ошибки теперь нет

.
Думаю рассмотрение этого примера мы закончили. Прейдем к созданию
запроса с заданными результатами.
{Пример 3. Выполняем запросы с заданными результатами}
Эти запросы нужны, когда требуется получить информацию из БД.
Рассмотрим следующий пример:
PHP код:
<?php
$user = "root"; //Имя пользователя
$password = ""; //Пароль пользователя
$host = "localhost"; //Хост
$db = "mysqli"; //БД
$sql = new mysqli($host,$user,$password,$db) or die(mysqli_connect_error());
$stmt = $sql->prepare("SELECT login,pass FROM users WHERE login=?"); //Отправляем шаблон
$stmt->bind_param("s",$l); //Устанавливаем параметры
$l = "Login";
$stmt->execute() or die("Предупреждение о неудачном запросе"); //Выполняем запрос
$stmt->bind_result($col1, $col2); //Сохраняем результат в массив
while ($stmt->fetch()) {
echo $col1.";".$col2; //Выводим результат пользователю.
}
$stmt->close(); //Удаляем шаблон из памяти.
$sql->close();
?>
В этом примере, мы
вывели результаты из Базы данных.
Все комманды делаются по анологии с запросами с заданными параметрами.
Кроме следующих моментов:
После того как мы выполнили запрос к
MySQL, осуществилось сохранение результата методом
"bind_result()".
Cинтаксис такой:
PHP код:
bind_result(имя_колонки1, имя_колонки2, ...);
После мы перебрали массив(
fetch()) и вывели данные.
Вы можете также попробывать, подставлять в запрос кавычкки. Результат будет нулевой, в отношении уязвимости

Думаю на этом примере я и закончу.
{Подведем итоги}
В этой статье я показал(надеюсь научил

), как создавать запросы расширением
MySQLi. Надеюсь статья направила вас на правильный путь работы с БД.
При использовании этого расширения, вы должны получать выгоду и почувствовать удобство работы с ним. Надеюсь статья вам понравилась. По возможности буду дополнять.
Не пинайте сильно.
Спасибо за внимание.
{LINKS}
ООП в PHP
Документация к MySQLi
SQL-injection
Copyright © Chaak