ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Основы работы с расширением MySQLi |

06.07.2008, 20:35
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
Основы работы с расширением MySQLi
{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
|
|
|

06.07.2008, 20:53
|
|
Постоянный
Регистрация: 28.09.2007
Сообщений: 820
Провел на форуме: 6722038
Репутация:
1385
|
|
и чем в MySQLi запросы отличаются от запросов в MySQL ?
мне не понятно ..
|
|
|

06.07.2008, 21:02
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
Сообщение от 159932
и чем в MySQLi запросы отличаются от запросов в MySQL ?
мне не понятно ..
Уточняю, язык MySQL тот же.
Запросы отличаются только тем, что используются разные операторы PHP работы с базой данных. Например:
простой запрос, подвержен MySQL инъекциям, если его не фильтровать. Т.е:
PHP код:
mysql_query(запрос на языке sql);
а запросы через эту библиотеку, осуществляются через предварительную подготовку параметров, оптимизации запроса. При использовании шаблонов(в частых запросах) мы экономим на траффике. Например нам надо отправить 30 аналогичных запросов, при условии что каждый запрос будет 100 байт. В итоге траффик - 3кб.
А используя библиотеку, мы можем отправить один раз 100 байт, а потом отправлять параметры по 2- 4 байта. В итоге экономия траффика в десятки раз больше!
|
|
|

06.07.2008, 21:14
|
|
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме: 19975136
Репутация:
4536
|
|
PHP код:
$this->kernel->db->sql_query("UPDATE " . TBL_TOPIC . " set posts = (posts + 1), last_post_time = '{$time}', last_poster_id = '{$this->kernel->user->userdata['user_id']}', last_poster_name = '{$this->kernel->user->userdata['display_name']}' where topic_id = '{$this->kernel->input['topic_id']}'", false, __LINE__, __FILE__);
//
$array = $this->kernel->db->sql_fetchrow();
все сразу без всяких непонятных 20 херней, типа иницилизации, переменных, их еще не путаться типы писать, очищать, зачищать.
че за херня вообще.
|
|
|

06.07.2008, 21:28
|
|
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме: 19975136
Репутация:
4536
|
|
это типа отзыв о расширении
|
|
|

06.07.2008, 21:28
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от GreenBear
че за херня вообще.
на заметку
Ведь, если звезды зажигают, значит — это кому-нибудь нужно?
Оформление порадовало)
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

01.10.2008, 15:59
|
|
Новичок
Регистрация: 18.08.2008
Сообщений: 8
Провел на форуме: 56704
Репутация:
5
|
|
имеется множество готовых CMS, вот интересно, почему в них не используется сия технология, а по-прежнему используется всё тот же php_mysql.ext?
за статью риспекты!
|
|
|

02.10.2008, 14:02
|
|
Members of Antichat - Level 5
Регистрация: 24.11.2006
Сообщений: 927
Провел на форуме: 7192869
Репутация:
3033
|
|
больше походит на книжку-расскраску чем на статью.
__________________
Дети индиго - это бездари, не надо песен! В пять лет едва говорить начинают, мы в этом возрасте стихи наизусть читали!
з.ы http://www.youtube.com/watch?v=sNsQe0KByRY Я ПлакалЪ
|
|
|

16.11.2008, 16:04
|
|
Познавший АНТИЧАТ
Регистрация: 14.01.2008
Сообщений: 1,165
Провел на форуме: 7229141
Репутация:
3099
|
|
Красиво оформлено =)
|
|
|

16.11.2008, 16:31
|
|
Познавший АНТИЧАТ
Регистрация: 22.11.2007
Сообщений: 1,822
Провел на форуме: 4468361
Репутация:
1549
|
|
перенесите пожалуйста статью из болталки. Жалко ведь когда такое пропадает в суе. Почитаю на досуге.
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|