Недавно я заметил, что в Интернете можно найти огромное количество PHP-классов для работы с базой данных . Как обычно, они всегда щеголяют своей функциональностью и количеством возможностей. Я решил тоже написать свой класс для работы с базой данных , но пошёл по другому пути. Я хотел сделать такой класс, чтобы в нё...

Класс для работы с базой данных

Недавно я заметил, что в Интернете можно найти огромное количество PHP-классов для работы с базой данных. Как обычно, они всегда щеголяют своей функциональностью и количеством возможностей. Я решил тоже написать свой класс для работы с базой данных, но пошёл по другому пути. Я хотел сделать такой класс, чтобы в нём был тот необходимый минимум функционала, который только и требуется. Всё остальное - это уже непонятные навороты, которые использовать, как минимум, небезопасно.

Привожу свой прокомментированный класс для работы с базой данных:

<?php
class DataBase {

  private static $db = null; // Единственный экземпляр класса, чтобы не создавать множество подключений
  private $mysqli; // Идентификатор соединения
  private $sym_query = "{?}"; // "Символ значения в запросе"

  /* Получение экземпляра класса. Если он уже существует, то возвращается, если его не было, то создаётся и возвращается (паттерн Singleton) */
  public static function getDB() {
    if (self::$db == null) self::$db = new DataBase();
    return self::$db;
  }

  /* private-конструктор, подключающийся к базе данных, устанавливающий локаль и кодировку соединения */
  private function __construct() {
    $this->mysqli = new mysqli("localhost", "root", "", "my_db");
    $this->mysqli->query("SET lc_time_names = 'ru_RU'");
    $this->mysqli->query("SET NAMES 'utf8'");
  }

  /* Вспомогательный метод, который заменяет "символ значения в запросе" на конкретное значение, которое проходит через "функции безопасности" */
  private function getQuery($query, $params) {
    if ($params) {
      for ($i = 0; $i < count($params); $i++) {
        $pos = strpos($query, $this->sym_query);
        $arg = "'".$this->mysqli->real_escape_string($params[$i])."'";
        $query = substr_replace($query, $arg, $pos, strlen($this->sym_query));
    }
    }
    return $query;
  }

  /* SELECT-метод, возвращающий таблицу результатов */
  public function select($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if (!$result_set) return false;
    return $this->resultSetToArray($result_set);
  }

  /* SELECT-метод, возвращающий одну строку с результатом */
  public function selectRow($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if ($result_set->num_rows != 1) return false;
    else return $result_set->fetch_assoc();
  }

  /* SELECT-метод, возвращающий значение из конкретной ячейки */
  public function selectCell($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if ((!$result_set) || ($result_set->num_rows != 1)) return false;
    else {
      $arr = array_values($result_set->fetch_assoc());
      return $arr[0];
    }
  }

  /* НЕ-SELECT методы (INSERT, UPDATE, DELETE). Если запрос INSERT, то возвращается id последней вставленной записи */
  public function query($query, $params = false) {
    $success = $this->mysqli->query($this->getQuery($query, $params));
    if ($success) {
      if ($this->mysqli->insert_id === 0) return true;
      else return $this->mysqli->insert_id;
    }
    else return false;
  }

  /* Преобразование result_set в двумерный массив */
  private function resultSetToArray($result_set) {
    $array = array();
    while (($row = $result_set->fetch_assoc()) != false) {
      $array[] = $row;
    }
    return $array;
  }

  /* При уничтожении объекта закрывается соединение с базой данных */
  public function __destruct() {
    if ($this->mysqli) $this->mysqli->close();
  }
}
?>

Как видите, нет ничего лишнего, только всё самое необходимое. Теперь разберём PHP-код, который использует данный класс:

<?php
  $db = DataBase::getDB(); // Создаём объект базы данных
  $query = "SELECT * FROM `users` WHERE `id` > {?} AND `online` = {?}";
  $table = $db->select($query, array(10, 1)); // Запрос явно должен вывести таблицу, поэтому вызываем метод select()
  $query = "SELECT `login` FROM `users` WHERE `email` = {?}";
  $login = $db->selectCell($query, array("test@mail.ru"));// Запрос должен вывести конкретную ячейку, поэтому вызываем метод selectCell()
?>

Теперь Вы понимаете, что для удобной и безопасной работой с базой данных вовсе не требуется библиотека из 100 классов. Всё необходимое имеется, и данный класс без проблем обработает любой запрос. Единственное, что я стоит - это настройки вынести в отдельный класс. То есть адрес хоста, имя пользователя, пароль, название базы данных, кодировку, локаль и "символ значения" вынести в отдельный класс, откуда их считывать.

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