Напишем простую обёртку для работы с mysqli.
Должен быть установлен единственный коннекшен с БД, т.е. реализован паттерн Singleton. Мы должны иметь возможность выполнять любые запросы и получать результат в удобной форме.
Например, если мы извлекаем значение единственного поля, то нам НЕ нужно возвращать объект mysqli_result, объект ряда (пусть даже с единственным property), а нам нужно только одно значение. Для этого будут реализованы следующие функции:
- select — выбирает любое количество рядов
- selectRow — выбирает только один ряд
- selectCol — выбирает значения только из определённого ряда и возвращает их
- selectCell — выбирает только одно поле
- query — для выполнения любых запросов, в том числе update
/** * Обёртка для работы с mysqli * Вернуть одну строку: DB::selectRow * Вернуть одно значение: DB::selectCell */ class DB { private static $instance; /** * Реализация Singleton pattern */ public static function instance() { if (!isset(DB::$instance)) { $db = array( 'host' => '127.0.0.1', 'user' => 'root', 'pass' => '', 'name' => 'test', ); self::connect($db); } return DB::$instance; } /** * Возвращает несколько рядов * * @param string $query * @param bool $asArray * @return array */ public static function select($query, $asArray = true) { $mysqli_result = self::instance()->query($query); if ($mysqli_result) { $r = array(); // Cycle through results while ($row = $mysqli_result->fetch_object()) { $r[] = $asArray ? (array) $row : $row; } return $r; } return array(); } /** * Возвращает один ряд таблицы * * @param string $query * @param bool $asArray * @return array */ public static function selectRow($query, $asArray = true) { $mysqli_result = self::instance()->query($query); if ($mysqli_result) { $row = $mysqli_result->fetch_row(); if ($row) { if ($asArray) { return (array) $row; } else { return $row; } } } return array(); } /** * Возвращает массив значений одного поля * * @param $query $query * @return array */ public static function selectCol($query) { $rows = self::select($query); return array_map(function ($row) {return array_shift($row);}, $rows); } /** * Возвращает значение одного поля * * @param string $query * @return string */ public static function selectCell($query) { $mysqli_result = self::instance()->query($query); if($mysqli_result) { $row = $mysqli_result->fetch_row(); if ($row) { return $row[0]; } } return NULL; } public static function query($query) { return self::instance()->query($query); } /** * Устанавливает коннект с БД */ public static function connect(array $db) { $mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['name']); if (!$mysqli->connect_error) { DB::$instance = $mysqli; } return $mysqli; } }
Использование библиотеки:
$rows = DB::select('SELECT * FROM sites'); $oneRow = DB::selectRow('SELECT * FROM sites'); $value = DB::selectCell('SELECT domain_name FROM sites'); $cols = DB::selectCol('SELECT domain_name FROM sites'); DB::query('UPDATE sites SET id=100500 where id=2'); // updates
Комментарии 6
Безопасней и правильней будет использовать PDO или, например, DBSimple dklab.ru/lib/DbSimple/
Я бы остановился на DBSimple - позволяет лаконично работать с БД, используются placeholder`ы, макроподстановки, может кэшировать результаты выполнения запросов.
По поводу DBSimple - это как конструктор "сделай сам". Сама либа очень древняя и давно не обновлялась, так что, чтобы она хорошо работаола, ее надо сильно подпиливать напильником.