Работа с запросами онлайн урок.


Для работы с запросами, добавим в наш класс методы query() и escape()

class DB
{
   protected $connection;
     public function __construct($host, $user, $password, $db_name)
     {
         $this->connection = new mysqli($host, $user, $password, $db_name);
         if( !$this->connection ) {
           throw new Exception('Could not connect to DB ');
     }
   }

   public function query($sql)
   {
   }

   public function escape($str)
   {
   }
}


Метод escape() будет экранировать специальные символы в запросе к серверу базы данных для избежания SQL-инъекций. Фактически этот метод будет служить оберткой для функции mysqli_escape_string()

public function escape($str)
{
   return mysqli_escape_string($this->connection, $str);
}


Теперь реализуем метод query(). Он будет основан на одноименном методе объекта соединения mysqli. Вызов метода query() объекта mysqli необходимо записывать при помощи защищенного свойства connection

public function query($sql)
{
   $result = $this->connection->query($sql);
}

Перед тем, как отправлять запрос, также необходимо проверить, актуально ли соединение с сервером баз данных:
public function query($sql)
{
   if ( !$this->connection ) {
     return false;
   }
   $result = $this->connection->query($sql);
}


В переменной $result содержится результат запроса к серверу БД. Он имеет тип resource. Если запрос не удается исполнить (например он написан с ошибкой), воспользуемся функцией mysqli_error() и бросим исключение:

public function query($sql)
{
   if ( !$this->connection ) {
     return false;
   }
   $result = $this->connection->query($sql);
   if ( mysqli_error($this->connection) ){
     throw new Exception(mysqli_error($this->connection));
   }
}


Эта функция (в случае ошибки) возвращает строку с описанием ошибки.

В случае, если запрос не содержит ошибок, из этой переменной еще необходимо добыть сами данные. Это можно сделать при помощи функции mysqli_fetch_assoc() - она принимает результат запроса в качестве аргумента и возвращает одну строку из таблицы результатов запроса в виде ассоциативного массива. Ключи этого массива - это поля таблицы. При этом каждый новый вызов этой функции будет возвращать новую строку из таблицы. Когда строки таблицы закончатся, функция вернет false. Каждую полученную строку мы будем добавлять в один большой результирующий массив:

public function query($sql)
{
   if ( !$this->connection ) {
     return false;
   }
   $result = $this->connection->query($sql);
   if ( mysqli_error($this->connection) ){
     throw new Exception(mysqli_error($this->connection));
   }
   $data = array();
   while( $row = mysqli_fetch_assoc($result) ){
     $data[] = $row;
   }
}


Таким образом нам осталось вернуть переменную $data из этого метода. Также необходимо включить в рассмотрение случай, когда запрос не связан с получением данных. Тогда наш метод должен вернуть просто то же, что и метод query() объекта mysqli. Эту строку добавим перед определением переменной $data

if (is_bool($reslut)) {
   return $result;
}
$data = array();
while( $row = mysqli_fetch_assoc($result) ){
   $data[] = $row;
}


В конце метода добавим строку очистки памяти, которая была выделена для сохранения результата запроса, а также возвращение полученных данных.

mysqli_free_result($result);
return $data;


Теперь наш класс будет иметь следующий вид:



Заметим, что мы сразу включили в конструктор вызов нового метода, для отправки запроса SET NAMES UTF8.

В следующем уроке мы рассмотрим использование этого класса на примере готовой базы данных.