Авторские статьи Основы работы с расширением MySQLi

Discussion in 'Статьи' started by Chaak, 6 Jul 2008.

  1. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    {INTRODUCTION}​

    Статья предназначена для web-программистов, имеющих опыт работы с PHP и MySQL.
    Статья освещает основы работы с расширением MySQLi.
    Для работы нам понадобится сервер с установленным интерпритатором PHP(c расширением MySQLi), и базой данных MySQL.
    Для этого подойдет WampServer (как с ним работать разберетесь сами).

    {ABOUT EXTENSION}​

    Для начала обратимся к Википедии:
    Расширение было создано Георгом Рихтером, для замены устаревшего расширения 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 буква = один параметр), и назначаются переменные, которые позже будут в БД.
    Приведу таблицу типов данных:
    В параметрах запроса, мы указали, что данные являются строчными по содержанию.
    Следующим шагом выполняется запрос методом "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
     
    12 people like this.
  2. 159932

    159932 Elder - Старейшина

    Joined:
    28 Sep 2007
    Messages:
    587
    Likes Received:
    462
    Reputations:
    5
    и чем в MySQLi запросы отличаются от запросов в MySQL ?
    мне не понятно ..
     
  3. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Уточняю, язык MySQL тот же.
    Запросы отличаются только тем, что используются разные операторы PHP работы с базой данных. Например:
    простой запрос, подвержен MySQL инъекциям, если его не фильтровать. Т.е:
    PHP:
    mysql_query(запрос на языке sql);
    а запросы через эту библиотеку, осуществляются через предварительную подготовку параметров, оптимизации запроса. При использовании шаблонов(в частых запросах) мы экономим на траффике. Например нам надо отправить 30 аналогичных запросов, при условии что каждый запрос будет 100 байт. В итоге траффик - 3кб.
    А используя библиотеку, мы можем отправить один раз 100 байт, а потом отправлять параметры по 2- 4 байта. В итоге экономия траффика в десятки раз больше!
     
  4. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    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 херней, типа иницилизации, переменных, их еще не путаться типы писать, очищать, зачищать.
    че за херня вообще.
     
    1 person likes this.
  5. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    это типа отзыв о расширении
     
  6. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    на заметку ;)
    Оформление порадовало)
     
    2 people like this.
  7. dArKkNiGHt

    dArKkNiGHt Banned

    Joined:
    18 Aug 2008
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    имеется множество готовых CMS, вот интересно, почему в них не используется сия технология, а по-прежнему используется всё тот же php_mysql.ext?

    за статью риспекты!
     
  8. Constantine

    Constantine Elder - Старейшина

    Joined:
    24 Nov 2006
    Messages:
    798
    Likes Received:
    710
    Reputations:
    301
    больше походит на книжку-расскраску чем на статью.
     
  9. ElteRUS

    ElteRUS Elder - Старейшина

    Joined:
    11 Oct 2007
    Messages:
    367
    Likes Received:
    460
    Reputations:
    93
    Зачем было переносить тему в болталку ? Это пристанище для быдло-тем. Лучше уже просто удалить статью если она не несет никакой ценности (по мнению модератора).
     
  10. Chode

    Chode Elder - Старейшина

    Joined:
    20 Jul 2008
    Messages:
    164
    Likes Received:
    19
    Reputations:
    0
    вот вот, издевательство
    Предлагать по 10 вариантов вывода слова через echo, в ветке "php для начинающих" - это считается нормальным.
    А как появляется внятная статья, с объясняющим все мелочи ТС, так ее сразу в болталку...
     
  11. someone

    someone New Member

    Joined:
    15 Feb 2013
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Как например такой запрос обернуть в безопасный
    Code:
    "SELECT loginization.*, 
    			users.nickname 
    			FROM loginization LEFT JOIN users ON (loginization.user_id = users.id)
    			WHERE
    				$user_s
    				$ip_s
    				$mod_constr
    				$msg_constr
    				ddate <='$end' AND  ddate >='$start'
    			ORDER BY ddate";