Напишем простую обёртку для работы с 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
Безопасней и правильней будет использовать PDO или, например, DBSimple dklab.ru/lib/DbSimple/
Я бы остановился на DBSimple - позволяет лаконично работать с БД, используются placeholder`ы, макроподстановки, может кэшировать результаты выполнения запросов.
По поводу DBSimple - это как конструктор "сделай сам". Сама либа очень древняя и давно не обновлялась, так что, чтобы она хорошо работаола, ее надо сильно подпиливать напильником.