Any db class php

Небольшой класс для работы с БД ( PDO )

Привет, Хабр! Очень много статей написано о PDO, но при этом очень мало реальных примеров. В этой статье я хочу представить свою версию класса для работы с базой данных (далее — БД). Эта статья будет полезна начинающим программистам, которые только осваивают эту технологию.

Внимание! Моё мнение может отличаться от вашего, поэтому хочу сразу сказать, что эта статья не есть истина в последней инстанции и реализация этого класса зависит от программиста и его предпочтений.

Вступление

Тут, я думаю, всё понятно, эти вещи можно не объяснять.

Далее большая часть пояснений будет содержаться в коде.

db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > > ?>

Прекрасно, мы подключились к БД. Теперь нам нужно создать метод, который позволит совершать SQL запросы.

db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < >> ?>

Реализация метода query

Мы готовы к реализации этого метода, но у нас возникает вопрос:

«Что за параметры он принимает и как он должен их использовать?»

Ответ на первый вопрос очевиден:

  • $sql — переменная с текстом SQL запроса.
  • $params — переменная с какими-то параметрами для запроса.

А что со вторым вопросом?

Всё так же просто, что бы ответить на этот вопрос, мы должны узнать, в каком виде нам подают эти параметры. А получаем мы их вот такими:

У незнающего человека возникает вопрос: «Что за двоеточие?» Я тут же отвечаю — такие запросы называются подготовленными и используются, дабы исключить возможность SQL инъекции.

Вернёмся к предыдущему вопросу и ответим на него:

Мы должны обойти массив $params и подставить значение в запрос.

Но сначала, мы должны подготовить запрос для подстановки этих значений. В итоге код будет выглядеть так:

db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < // Подготовка запроса $stmt = $this->db->prepare($sql); // Обход массива с параметрами // и подставление значений if ( !empty($params) ) < foreach ($params as $key =>$value) < $stmt->bindValue(":$key", $value); > > // Выполняем запрос $stmt->execute(); // Возвращаем ответ return $stmt->fetchAll(PDO::FETCH_ASSOC); > > ?>

Некоторые комментарии немного искажают истину, но при этом кардинально ничего не меняют

Мы имеем уже довольно мощный инструмент, использующий подготовленные запросы и требующий от разработчиков знание SQL, а не тонкостей класса. Но при этом, я бы зашил в этот класс типовые запросы, такие как:

  • getAll() — двумерный массив, индексированный числами по порядку
  • getRow() — одномерный массив, первую строку результата

Моя реализация

Эти методы могут быть реализованы по разному, но я представлю свою реализацию.

db = new PDO('mysql:host=' . $dbinfo['host'] . ';dbname=' . $dbinfo['dbname'], $dbinfo['login'], $dbinfo['password']); > // Операции над БД public function query($sql, $params = []) < // Подготовка запроса $stmt = $this->db->prepare($sql); // Обход массива с параметрами // и подставляем значения if ( !empty($params) ) < foreach ($params as $key =>$value) < $stmt->bindValue(":$key", $value); > > // Выполняя запрос $stmt->execute(); // Возвращаем ответ return $stmt->fetchAll(PDO::FETCH_ASSOC); > public function getAll($table, $sql = '', $params = []) < return $this->query("SELECT * FROM $table" . $sql, $params); > public function getRow($table, $sql = '', $params = []) < $result = $this->query("SELECT * FROM $table" . $sql, $params); return $result[0]; > > ?>

Здесь эти методы реализованы, возможно не лучшим образом, но реализованы.

Так же сюда можно добавить ещё функции, упрощающие жизнь, но лично мне этого с головой хватает.

Можно добавить следующие методы:

  • getOne() — возвращает первый элемент первой строки результата
  • getCol() — возвращает 1 колонку таблицы
  • и т.д.

Применение

Мы написали наш класс. Теперь нам нужно протестировать его в реальном «бою».

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

Далее я не буду приводить код класса DB . Подразумевается, что этот класс либо написан выше, либо подключается к этому скрипту.

Так как ранее я не показал файл dbinfo.php — сейчас я приведу код этого конфигурационного файла.

 '127.0.0.1', 'dbname' => 'test', 'login' => 'root', 'password' => '' ]; ?>

Это понятно и не требует объяснения, идём дальше. Теперь, давайте попросим БД test вернуть нам значение всех постов при помощи нашего класса.

 // Создаём объект $db = new DB; // Получаем и выводим данные echo "
"; print_r($db->getAll('posts')); ?>

На выходе мы имеем следующее:

данные из БД

Отлично, а теперь давайте выведем только первый пост.

 // Создаём объект $db = new DB; // Получаем и выводим данные echo "
"; print_r($db->getRow('posts')); ?>

данные из БД

Прекрасно. Ну и в конце добавим запись и выведем данные до и после.

 // Создаём объект $db = new DB; // Получаем и выводим данные echo "

До

"; print_r($db->getAll('posts')); echo "

После

"; $params = [ 'title' => 'Заголовок через PHP', 'author' => 'Автор через PHP' ]; $db->query('INSERT INTO `posts` ( title, author ) VALUES ( :title, :author )', $params); print_r($db->getAll('posts')); ?>

данные из БД

Мы получили то, что хотели и убедились в том, что этот класс рабочий.

В заключении

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

Ссылка на github: class DB

Источник

PHP Class MySQLi — СУБД MySQL

На сегодняшний день существует множество статей с готовыми решениями, как работать с СУБД MySQL. Однако, почти в каждой статье приводятся примеры процедурного вызова функций. Начиная с php-версии 5.5.0 расширение MySQL будет удалено из сборки и вообще, это расширение уже устарело. Вместо него будем использовать расширение MySQLi в ООП.
Данная статья является готовым решением для работы с СУБД.

При разработке очередного проекта, я столкнулся с тем, что в каждом методе следующего написанного класса с обращением к СУБД, мне нужно было обращаться к классу работы с СУБД, для очередного select, insert, update и т.п., то есть тягать в функции параметра global с объявленной переменной вне класса. А устанавливать новое соединение с базой — слишком затратно, да и не выгодно, только ресурсы системы тратить. И решил написать переписать класс работы с базой, с сохранением экземпляра класса, чтобы обращаться сразу напрямую к методам класса из любой области видимости переменной.

Для просмотра исходника смотрим под кат.

Для инициализации класса достаточно создать экземпляр класса.
Переменную $db не следует удалять после объявления, т.к. ее адрес используется для дальнейшей работы со статическими методами класса.

 catch (Exception $e) < exit($e->getMessage()); > ?> 

Ниже приведу содержимое класса DB.class.php

connect_error) throw new Exception("Connect failed: %s", $mysqli->connect_error); self::$mysqli = &$mysqli; self::$mysqli->query('SET NAMES utf8 COLLATE utf8_general_ci'); > public static function GetRows($rows, $single = false) < $result = array(); if ($rows === false) return $result; if ($single) return $rows->fetch_assoc(); while ($row = $rows->fetch_assoc()) array_push($result, $row); $rows->free(); return $result; > public static function Select($sql, $single = false) < $result = self::$mysqli->query($sql); return self::$db->GetRows($result, $single); > public static function Update($data, $table, $where) < $sets = ''; foreach ($data as $column =>$value) < $sets .= $sets ? ', ' : ''; $sets .= "`$column` = '$value'"; >$sql = "UPDATE $table SET $sets WHERE $where"; self::$mysqli->query($sql); > public static function Insert($data, $table) < $columns = ""; $values = ""; foreach ($data as $column =>$value) < $columns .= $columns ? ', ' : ''; $columns .= "`$column`"; $values .= $values ? ', ' : ''; $values .= "'$value'"; >$sql = "INSERT INTO $table ($columns) VALUES ($values)"; self::$mysqli->query($sql); return self::$mysqli->insert_id; > public static function CountRows($table, $request = false) < $sql = "SELECT COUNT(*) FROM $table "; $sql .= $request ? $request : ''; $result = self::$mysqli->query($sql); $count = $result->fetch_array(); $result->free(); return $count[0]; > public static function Query($sql) < return self::$mysqli->query($sql); > public static function Delete($table, $where) < $sql = "DELETE FROM $table WHERE $where"; self::$mysqli->query($sql); > public static function Close() < self::$mysqli->close(); > function __destruct() < self::$db->Close(); > > ?> 

Источник

Читайте также:  Not null string javascript
Оцените статью