Разрабатываем класс для взаимодействия с MySQL (mysqli)

Уроки по PHP, Javascript и т.п.
Ответить
Evegeniy
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49

Разрабатываем класс для взаимодействия с MySQL (mysqli)

Сообщение Evegeniy »

Всем привет. Ни для кого не секрет что вскоре из PHP будет исключено расширение mysql.
Так вот, нам рекомендуют переходить на mysqli расширение (есть и другие варианты, но я их не тестировал)
Что будет в данном уроке :
  • Класс для взаимодействия с mysql через расширение mysql (версия устарела, но она может быть полезна)
  • Класс для взаимодействия с mysql через расширение mysqli (новая версия, будет актуальна на >= php5)
Итак, начнем. Сначала определим список методов, которые нужны нам в классе :
boolean Connect() - соединение с БД
void Disconnect() - отключение от БД
resource Query($query) - простой запрос без проверки данных
resource QueryEx($query, $keys, $value) - запрос с шаблоном ($query - шаблон, $keys - массив ключей которые надо заменить элементами массива $value при этом массив $value будет проверяться на sqlinj (базовый пример) )
array ToArray($resource) - перевод результата запроса в array
int GetCount($resource) - количество полей, которое будет получено после запроса
array GetErrors() - функция для отладки получает массив ошибок, которые произошли во время работы класса
array GetRequests() - функция для отладки получает массив запросов, которые мы делали во время работы класса
string GetLastRequst() - функция для отладки получает последний запрос из метода GetRequests()
Все представленные методы актуальны будут для обоих вариаций класса (mysql, mysqli)
Шаг 1. Создадим конфигуратор
Вот его код :

Код: Выделить всё

<?phpdefine('MYSQL_USER',      'login');define('MYSQL_HOST',      'localhost');define('MYSQL_BASENAME',  'base name');define('MYSQL_PASS',      'password');?>
Файл надо назвать config.php
Шаг 2. Создадим основу для класса
Вот код основы шаблона :

Код: Выделить всё

<?phpinclude_once 'config.php';class MySQL{    var $connection;               //ид подключение (NULL если ошибка или нет подключения)    var $error_log = array();   //массив ошибок    var $requests = array();    //массив запросов        function __construct(){        $this->connection = NULL; // нет подключение        $this->error_log  = array();         $this->requests   = array();     }    public function Connect()    {            }    public function Disconnect()    {            }    public function Query($query)    {            }    public function QueryEx($source_tpl, $args_a, $args_b){             }    public function ToArray($result)    {            }    public function GetCount($result)    {            }    public function GetErrors()    {            }    public function GetRequests()    {            }    public function GetLastRequst()    {            }}?>
Шаг 3.1 [Расширение mysqli]
Реализация класса под расширение php mysqli :

Код: Выделить всё

<?phpinclude_once 'config.php';class MySQL{    var $connection;    var $error_log = array();    var $requests = array();        function __construct(){        $this->connection = NULL;        $this->error_log  = array();        $this->requests   = array();    }    public function Connect()    {        $this->connection = mysqli_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS,MYSQL_BASENAME);        if (!$this->connection) {  array_push($this->error_log, mysqli_connect_error()); return false; }        if (!mysqli_query($this->connection, "SET NAMES 'utf8'")){ array_push($this->error_log, $this->connection->error); return false; }        return true;    }    public function Disconnect()    {        if ($this->connection){            $this->connection->close();        }        return false;    }    public function Query($query)    {        array_push($this->requests, $query);        $resp = $this->connection->query($query);        if (!$resp){  array_push($this->error_log, $this->connection->error); return false; }        return $resp;    }    public function QueryEx($source_tpl, $args_a, $args_b){         $online = array();        $keys   = array();        for ($i = 0; $i < count($args_b); $i++){            $keys[$i] = $this->connection->real_escape_string($args_b[$i]);        }        $online = array_combine($args_a, $keys);        $query = strtr($source_tpl, $online);        array_push($this->requests, $query);        $resp = $this->connection->query($query);        if (!$resp){  array_push($this->error_log, $this->connection->error); return false; }        return $resp;    }    public function ToArray($result)    {        $temp = $result->fetch_assoc();        if (!$temp){ array_push($this->error_log, $this->connection->error); return false; }        return $temp;    }    public function GetCount($result)    {        $temp = mysqli_num_rows($result);        if (!$temp){ array_push($this->error_log, $this->connection->error); return false; }        return intval($temp);    }    public function GetErrors()    {        return $this->error_log;    }    public function GetRequests()    {        return $this->requests;    }    public function GetLastRequst()    {        return $this->requests[count($this->requests) - 1];    }}?>
Шаг 3.2 [Расширение mysql]
Реализация класса под расширение php mysql :

Код: Выделить всё

<?phpinclude_once 'config.php'; class MySQL{    var $connection_id   = -1;    var $error_log       = array();    var $requests        = array();        public function Connect()   //подключаемся к mysql    {        $this->connection_id = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);       //константы из config.class.php                if (!$this->connection_id){ array_push($this->error_log, mysql_error()); return false;  }        if (!mysql_select_db(MYSQL_BASENAME)){ array_push($this->error_log, mysql_error()); return false;                   }        if (!mysql_query("SET NAMES 'utf8'")){ array_push($this->error_log, mysql_error()); return false;                   }        return true;    }    public function Disconnect()    //отключаемся от mysql    {        if ($this->connection_id != -1){            if (!mysql_close($this->connection_id)){ array_push($this->error_log, mysql_error()); return false; }            return true;        }        return false;    }    public function Query($query)    {        array_push($this->requests, $query);        $resp = mysql_query($query);        if (!$resp){  array_push($this->error_log, mysql_error()); return false; }        return $resp;    }    public function QueryEx($source_tpl, $args_a, $args_b){        $online = array();        $keys   = array();        for ($i = 0; $i < count($args_b); $i++){            $keys[$i] = mysql_real_escape_string($args_b[$i]);        }        $online = array_combine($args_a, $keys);        $query = strtr($source_tpl, $online);        array_push($this->requests, $query);        $resp = mysql_query($query);        if (!$resp){  array_push($this->error_log, mysql_error()); return false; }        return $resp;    }    public function ToArray($result)    //переводим результат запроса в массив    {        $temp = mysql_fetch_array($result);        if (!$temp){ array_push($this->error_log, mysql_error()); return false; }        return $temp;    }    public function GetCount($result)   //получаем кол-во записей после запроса    {        $temp = mysql_num_rows($result);        if (!$temp){ array_push($this->error_log, mysql_error()); return false; }        return intval($temp);    }    public function GetErrors()     //список ошибок для отладки    {        return $this->error_log;    }    public function GetRequests()   //все запросы во время сессии    {        return $this->requests;    }    public function GetLastRequst()    {        return $this->requests[count($this->requests) - 1];    }}?>
Данный код не гарантирует оптимальную работу с mysql, он лишь показывает как можно реализовать класс для взаимодействия с mysql. Данный класс используется во всех моих проектах.

Все ошибки и/или кривые моменты пишите в комментарии. Буду благодарен вам. Оба класса проверены на работоспособность. :D
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Разрабатываем класс для взаимодействия с MySQL (mysqli)

Сообщение Serge »

Evegeniy
не воспринимайте как критику, мне просто интересно. А зачем это надо? Почему не пользоваться банальным mysqli_connect и mysqli_query?
Evegeniy
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49

Re: Разрабатываем класс для взаимодействия с MySQL (mysqli)

Сообщение Evegeniy »

Мне это помогло при отладке взаимодействия с mysql к тому же проще контролировать запросы.
"Черной" работы минимум вот самый простой отрывок кода :

Код: Выделить всё

 <?phprequire 'mysql.class.php';$base = new MySQL();if ($base->Connect()){   $src = $base->Query('SELECT * FROM `base` WHERE `id`=0;');   if ($src)   {      $data = $base->ToArray($src);      echo 'test : '.$data['id'];   }}?> 
это такой мини-пример :D
и к такому классу очень легко прикрутить кэширование на стороне сервера.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Разрабатываем класс для взаимодействия с MySQL (mysqli)

Сообщение Александр »

Serge писал(а):А зачем это надо? Почему не пользоваться банальным mysqli_connect и mysqli_query?
Удобство как при текущей разработке, так и последующей поддержке.
Например, тому кто использовал в коде mysql (который устарел) и в будущем захочет перейти на сервер с PHP более свежей версии, придется делать изменения во всех файлах, хотя можно было бы исправить только в одном классе.

Когда-то тоже писал свой класс для взаимодействия с базой, но сейчас перешел на SafeMySQL http://phpfaq.ru/safemysql - удобно.
http://habrahabr.ru/post/165069/
Evegeniy
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49

Re: Разрабатываем класс для взаимодействия с MySQL (mysqli)

Сообщение Evegeniy »

Когда-то тоже писал свой класс для взаимодействия с базой, но сейчас перешел на SafeMySQL http://phpfaq.ru/safemysql - удобно.
http://habrahabr.ru/post/165069/
Пойду почитаю, спасибо =)
Ответить