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

ctrl+enter

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

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