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

Уроки по PHP, Javascript и т.п.

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

Сообщение Evegeniy » 05 май 2013, 12:28

Всем привет. Ни для кого не секрет что вскоре из 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. Создадим конфигуратор
Вот его код :
  1. <?php
  2. define('MYSQL_USER',      'login');
  3. define('MYSQL_HOST',      'localhost');
  4. define('MYSQL_BASENAME',  'base name');
  5. define('MYSQL_PASS',      'password');
  6. ?>

Файл надо назвать config.php
Шаг 2. Создадим основу для класса
Вот код основы шаблона :
  1. <?php
  2. include_once 'config.php';
  3. class MySQL
  4. {
  5.     var $connection;               //ид подключение (NULL если ошибка или нет подключения)
  6.     var $error_log = array();   //массив ошибок
  7.     var $requests = array();    //массив запросов
  8.    
  9.     function __construct(){
  10.         $this->connection = NULL; // нет подключение
  11.         $this->error_log  = array();
  12.         $this->requests   = array();
  13.     }
  14.     public function Connect()
  15.     {
  16.        
  17.     }
  18.     public function Disconnect()
  19.     {
  20.        
  21.     }
  22.     public function Query($query)
  23.     {
  24.        
  25.     }
  26.     public function QueryEx($source_tpl, $args_a, $args_b){ 
  27.        
  28.     }
  29.     public function ToArray($result)
  30.     {
  31.        
  32.     }
  33.     public function GetCount($result)
  34.     {
  35.        
  36.     }
  37.     public function GetErrors()
  38.     {
  39.        
  40.     }
  41.     public function GetRequests()
  42.     {
  43.        
  44.     }
  45.     public function GetLastRequst()
  46.     {
  47.        
  48.     }
  49. }
  50. ?>

Шаг 3.1 [Расширение mysqli]
Реализация класса под расширение php mysqli :
  1. <?php
  2. include_once 'config.php';
  3. class MySQL
  4. {
  5.     var $connection;
  6.     var $error_log = array();
  7.     var $requests = array();
  8.    
  9.     function __construct(){
  10.         $this->connection = NULL;
  11.         $this->error_log  = array();
  12.         $this->requests   = array();
  13.     }
  14.     public function Connect()
  15.     {
  16.         $this->connection = mysqli_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS,MYSQL_BASENAME);
  17.         if (!$this->connection) {  array_push($this->error_log, mysqli_connect_error()); return false; }
  18.         if (!mysqli_query($this->connection, "SET NAMES 'utf8'")){ array_push($this->error_log, $this->connection->error); return false; }
  19.         return true;
  20.     }
  21.     public function Disconnect()
  22.     {
  23.         if ($this->connection){
  24.             $this->connection->close();
  25.         }
  26.         return false;
  27.     }
  28.     public function Query($query)
  29.     {
  30.         array_push($this->requests, $query);
  31.         $resp = $this->connection->query($query);
  32.         if (!$resp){  array_push($this->error_log, $this->connection->error); return false; }
  33.         return $resp;
  34.     }
  35.     public function QueryEx($source_tpl, $args_a, $args_b){ 
  36.         $online = array();
  37.         $keys   = array();
  38.         for ($i = 0; $i < count($args_b); $i++){
  39.             $keys[$i] = $this->connection->real_escape_string($args_b[$i]);
  40.         }
  41.         $online = array_combine($args_a, $keys);
  42.         $query = strtr($source_tpl, $online);
  43.         array_push($this->requests, $query);
  44.         $resp = $this->connection->query($query);
  45.         if (!$resp){  array_push($this->error_log, $this->connection->error); return false; }
  46.         return $resp;
  47.     }
  48.     public function ToArray($result)
  49.     {
  50.         $temp = $result->fetch_assoc();
  51.         if (!$temp){ array_push($this->error_log, $this->connection->error); return false; }
  52.         return $temp;
  53.     }
  54.     public function GetCount($result)
  55.     {
  56.         $temp = mysqli_num_rows($result);
  57.         if (!$temp){ array_push($this->error_log, $this->connection->error); return false; }
  58.         return intval($temp);
  59.     }
  60.     public function GetErrors()
  61.     {
  62.         return $this->error_log;
  63.     }
  64.     public function GetRequests()
  65.     {
  66.         return $this->requests;
  67.     }
  68.     public function GetLastRequst()
  69.     {
  70.         return $this->requests[count($this->requests) - 1];
  71.     }
  72. }
  73. ?>

Шаг 3.2 [Расширение mysql]
Реализация класса под расширение php mysql :
  1. <?php
  2. include_once 'config.php';
  3. class MySQL
  4. {
  5.     var $connection_id   = -1;
  6.     var $error_log       = array();
  7.     var $requests        = array();
  8.    
  9.     public function Connect()   //подключаемся к mysql
  10.     {
  11.         $this->connection_id = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);       //константы из config.class.php
  12.        
  13.         if (!$this->connection_id){ array_push($this->error_log, mysql_error()); return false;  }
  14.         if (!mysql_select_db(MYSQL_BASENAME)){ array_push($this->error_log, mysql_error()); return false;                   }
  15.         if (!mysql_query("SET NAMES 'utf8'")){ array_push($this->error_log, mysql_error()); return false;                   }
  16.         return true;
  17.     }
  18.     public function Disconnect()    //отключаемся от mysql
  19.     {
  20.         if ($this->connection_id != -1){
  21.             if (!mysql_close($this->connection_id)){ array_push($this->error_log, mysql_error()); return false; }
  22.             return true;
  23.         }
  24.         return false;
  25.     }
  26.     public function Query($query)
  27.     {
  28.         array_push($this->requests, $query);
  29.         $resp = mysql_query($query);
  30.         if (!$resp){  array_push($this->error_log, mysql_error()); return false; }
  31.         return $resp;
  32.     }
  33.     public function QueryEx($source_tpl, $args_a, $args_b){
  34.         $online = array();
  35.         $keys   = array();
  36.         for ($i = 0; $i < count($args_b); $i++){
  37.             $keys[$i] = mysql_real_escape_string($args_b[$i]);
  38.         }
  39.         $online = array_combine($args_a, $keys);
  40.         $query = strtr($source_tpl, $online);
  41.         array_push($this->requests, $query);
  42.         $resp = mysql_query($query);
  43.         if (!$resp){  array_push($this->error_log, mysql_error()); return false; }
  44.         return $resp;
  45.     }
  46.     public function ToArray($result)    //переводим результат запроса в массив
  47.     {
  48.         $temp = mysql_fetch_array($result);
  49.         if (!$temp){ array_push($this->error_log, mysql_error()); return false; }
  50.         return $temp;
  51.     }
  52.     public function GetCount($result)   //получаем кол-во записей после запроса
  53.     {
  54.         $temp = mysql_num_rows($result);
  55.         if (!$temp){ array_push($this->error_log, mysql_error()); return false; }
  56.         return intval($temp);
  57.     }
  58.     public function GetErrors()     //список ошибок для отладки
  59.     {
  60.         return $this->error_log;
  61.     }
  62.     public function GetRequests()   //все запросы во время сессии
  63.     {
  64.         return $this->requests;
  65.     }
  66.     public function GetLastRequst()
  67.     {
  68.         return $this->requests[count($this->requests) - 1];
  69.     }
  70. }
  71. ?>

Данный код не гарантирует оптимальную работу с mysql, он лишь показывает как можно реализовать класс для взаимодействия с mysql. Данный класс используется во всех моих проектах.

Все ошибки и/или кривые моменты пишите в комментарии. Буду благодарен вам. Оба класса проверены на работоспособность. :D
Evegeniy

 
Автор темы
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение Serge » 05 май 2013, 18:31

Evegeniy
не воспринимайте как критику, мне просто интересно. А зачем это надо? Почему не пользоваться банальным mysqli_connect и mysqli_query?
http://sevenlines.com.ua - разработка и продвижение сайтов
Serge
WEB Team
WEB Team
 
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55
Благодарил (а): 2 раз.
Поблагодарили: 65 раз.

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

Сообщение Evegeniy » 05 май 2013, 22:27

Мне это помогло при отладке взаимодействия с mysql к тому же проще контролировать запросы.
"Черной" работы минимум вот самый простой отрывок кода :
  1.  
  2. <?php
  3. require 'mysql.class.php';
  4. $base = new MySQL();
  5. if ($base->Connect())
  6. {
  7.    $src = $base->Query('SELECT * FROM `base` WHERE `id`=0;');
  8.    if ($src)
  9.    {
  10.       $data = $base->ToArray($src);
  11.       echo 'test : '.$data['id'];
  12.    }
  13. }
  14. ?>
  15.  

это такой мини-пример :D
и к такому классу очень легко прикрутить кэширование на стороне сервера.
Evegeniy

 
Автор темы
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Александр » 06 май 2013, 14:19

Serge писал(а):А зачем это надо? Почему не пользоваться банальным mysqli_connect и mysqli_query?

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

Когда-то тоже писал свой класс для взаимодействия с базой, но сейчас перешел на SafeMySQL http://phpfaq.ru/safemysql - удобно.
http://habrahabr.ru/post/165069/
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение Evegeniy » 06 май 2013, 17:06

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

Пойду почитаю, спасибо =)
Evegeniy

 
Автор темы
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.


Вернуться в Уроки на другие темы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron