ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Основы работы с расширением MySQLi
  #1  
Старый 06.07.2008, 20:35
Аватар для Chaak
Chaak
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме:
5321514

Репутация: 3313


Отправить сообщение для Chaak с помощью ICQ
По умолчанию Основы работы с расширением 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. Подключаемся к базе данных}

Для начала и последующей работы нам нужно подключится к БД.
Для этого нам потребуются:
  1. логин пользователя БД
  2. пароль пользователя БД
  3. хост(обычно localhost) с БД
  4. База Данных(предварительно создайте базу в PhpMyadmin'е - mysqli).
  5. Таблица 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).

Нужно учесть несколько важных особенностей:
  1. Тело шаблона отсылается серверу MySQL только один раз, но выполнять его можем большое количество раз, посылая разные параметры.
  2. Расширение автоматически представляет все операторы(SQL) в виде параметров, так что о SQL-инъекциях можно забыть.
Следовательно нам не нужно фильтровать запрос разными функциями на подобие "mysql_real_escape_string()". Расширение само оптимизирует запрос.

Шаблон запроса будет выглядеть так:
PHP код:
INSERT INTO table_name (name_coloumn1name_colloumn2VALUES (?, ?); 
где знак вопроса будет местом для подстановки параметра.
Обратите внимание(я сам в этом месте поначалу ошибался): знак вопроса не надо заключать в кавычки, т.к расширение вернет ошибку.

Создадим новую запись в БД:
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
 
Ответить с цитированием

  #2  
Старый 06.07.2008, 20:53
Аватар для 159932
159932
Постоянный
Регистрация: 28.09.2007
Сообщений: 820
Провел на форуме:
6722038

Репутация: 1385


По умолчанию

и чем в MySQLi запросы отличаются от запросов в MySQL ?
мне не понятно ..
 
Ответить с цитированием

  #3  
Старый 06.07.2008, 21:02
Аватар для Chaak
Chaak
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме:
5321514

Репутация: 3313


Отправить сообщение для Chaak с помощью ICQ
По умолчанию

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

  #4  
Старый 06.07.2008, 21:14
Аватар для GreenBear
GreenBear
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме:
19975136

Репутация: 4536


Отправить сообщение для GreenBear с помощью ICQ
Thumbs down

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 херней, типа иницилизации, переменных, их еще не путаться типы писать, очищать, зачищать.
че за херня вообще.
 
Ответить с цитированием

  #5  
Старый 06.07.2008, 21:28
Аватар для GreenBear
GreenBear
наркоман с медалью
Регистрация: 07.05.2005
Сообщений: 3,704
Провел на форуме:
19975136

Репутация: 4536


Отправить сообщение для GreenBear с помощью ICQ
По умолчанию

это типа отзыв о расширении
 
Ответить с цитированием

  #6  
Старый 06.07.2008, 21:28
Аватар для desTiny
desTiny
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
 
Ответить с цитированием

  #7  
Старый 01.10.2008, 15:59
Аватар для dArKkNiGHt
dArKkNiGHt
Новичок
Регистрация: 18.08.2008
Сообщений: 8
Провел на форуме:
56704

Репутация: 5
По умолчанию

имеется множество готовых CMS, вот интересно, почему в них не используется сия технология, а по-прежнему используется всё тот же php_mysql.ext?

за статью риспекты!
 
Ответить с цитированием

  #8  
Старый 02.10.2008, 14:02
Аватар для Constantine
Constantine
Members of Antichat - Level 5
Регистрация: 24.11.2006
Сообщений: 927
Провел на форуме:
7192869

Репутация: 3033


По умолчанию

больше походит на книжку-расскраску чем на статью.
__________________

Дети индиго - это бездари, не надо песен! В пять лет едва говорить начинают, мы в этом возрасте стихи наизусть читали!

з.ы http://www.youtube.com/watch?v=sNsQe0KByRY Я ПлакалЪ
 
Ответить с цитированием

  #9  
Старый 16.11.2008, 16:04
Аватар для xcedz
xcedz
Познавший АНТИЧАТ
Регистрация: 14.01.2008
Сообщений: 1,165
Провел на форуме:
7229141

Репутация: 3099


По умолчанию

Красиво оформлено =)
 
Ответить с цитированием

  #10  
Старый 16.11.2008, 16:31
Аватар для Cthulchu
Cthulchu
Познавший АНТИЧАТ
Регистрация: 22.11.2007
Сообщений: 1,822
Провел на форуме:
4468361

Репутация: 1549


Отправить сообщение для Cthulchu с помощью ICQ
По умолчанию

перенесите пожалуйста статью из болталки. Жалко ведь когда такое пропадает в суе. Почитаю на досуге.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Toolkit для работы с mysql inj от меня Piflit PHP, PERL, MySQL, JavaScript 33 09.06.2010 22:03
Как «растянуть» аккумулятор novichok Сотовый фрикинг 4 28.02.2006 22:47
Основы анализирования алгоритмов работы веб-приложений qBiN Чужие Статьи 9 03.02.2006 16:24
Заключение эксперта .PurGeN. Чужие Статьи 2 02.08.2005 04:03



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ