Простая обёртка для mysqli

Напишем простую обёртку для работы с 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

 

 
Поисковые запросы, по которым приходили пользователи
 
 
 
 

icon Комментарии 6

 Sedoi 3 года назад
А чем ЭТО лучше чем стандартный PDO? Не вижу никакого смысла, пустой вброс для контента.
 root 3 года назад
Sedoi, это ничем не лучше PDO. Это один из моих первых классов на php. Единственный плюс тот, что обёртка самописная.
Безопасней и правильней будет использовать PDO или, например, DBSimple dklab.ru/lib/DbSimple/
Я бы остановился на DBSimple - позволяет лаконично работать с БД, используются placeholder`ы, макроподстановки, может кэшировать результаты выполнения запросов.
 Sedoi 3 года назад
"Единственный плюс тот, что обёртка самописная. " - я бы сказал, что это огромный минус.
По поводу DBSimple - это как конструктор "сделай сам". Сама либа очень древняя и давно не обновлялась, так что, чтобы она хорошо работаола, ее надо сильно подпиливать напильником.
 root 3 года назад
Насчёт DBSimple - что то я не замечал за ней косяков, чтобы надо было ходить и подпиливать. Методы выглядят красиво, мне нравится эта либа.
 Sedoi 3 года назад
dklab.ru/lib/DbSimple/ - смотрим год обновления. 2006!!!! Это ж какая версия мускуля была? Либа ужасно старая и полюбому надо что-то будет допиливать.
 root 3 года назад
Действительно, 2006 год, может работать с php4.. Да, тогда, пожалуй, соглашусь.
Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ