PHP-класс обертка для PDO

Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание экземпляра класса.

Но имеет и ряд недостатков:

  • Необходимо запоминать название методов.
  • При ошибке в запросе PHP покажет неправильное место где произошла ошибка, что усложняет отладку.
1
class DB
{
	public static $dsn = 'mysql:dbname=table;host=localhost';
	public static $user = 'user';
	public static $pass = 'password';

	/**
	 * Объект PDO.
	 */
	public static $dbh = null;

	/**
	 * Statement Handle.
	 */
	public static $sth = null;

	/**
	 * Выполняемый SQL запрос.
	 */
	public static $query = '';

	/**
	 * Подключение к БД.
	 */
	public static function getDbh()
	{	
		if (!self::$dbh) {
			try {
				self::$dbh = new PDO(
					self::$dsn, 
					self::$user, 
					self::$pass, 
					array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")
				);
				self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
			} catch (PDOException $e) {
				exit('Error connecting to database: ' . $e->getMessage());
			}
		}

		return self::$dbh; 
	}
	
	/**
	 * Закрытие соединения.
	 */
	public static function destroy()
	{	
		self::$dbh = null;
		return self::$dbh; 
	}

	/**
	 * Получение ошибки запроса.
	 */
	public static function getError()
	{
		$info = self::$sth->errorInfo();
		return (isset($info[2])) ? 'SQL: ' . $info[2] : null;
	}

	/**
	 * Возвращает структуру таблицы в виде ассоциативного массива.
	 */
	public static function getStructure($table)
	{
		$res = array();
		foreach (self::getAll("SHOW COLUMNS FROM {$table}") as $row) {
			$res[$row['Field']] = (is_null($row['Default'])) ? '' : $row['Default'];
		}

		return $res;
	}

	/**
	 * Добавление в таблицу, в случаи успеха вернет вставленный ID, иначе 0.
	 */
	public static function add($query, $param = array())
	{
		self::$sth = self::getDbh()->prepare($query);
		return (self::$sth->execute((array) $param)) ? self::getDbh()->lastInsertId() : 0;
	}
	
	/**
	 * Выполнение запроса.
	 */
	public static function set($query, $param = array())
	{
		self::$sth = self::getDbh()->prepare($query);
		return self::$sth->execute((array) $param);
	}
	
	/**
	 * Получение строки из таблицы.
	 */
	public static function getRow($query, $param = array())
	{
		self::$sth = self::getDbh()->prepare($query);
		self::$sth->execute((array) $param);
		return self::$sth->fetch(PDO::FETCH_ASSOC);		
	}
	
	/**
	 * Получение всех строк из таблицы.
	 */
	public static function getAll($query, $param = array())
	{
		self::$sth = self::getDbh()->prepare($query);
		self::$sth->execute((array) $param);
		return self::$sth->fetchAll(PDO::FETCH_ASSOC);	
	}
	
	/**
	 * Получение значения.
	 */
	public static function getValue($query, $param = array(), $default = null)
	{
		$result = self::getRow($query, $param);
		if (!empty($result)) {
			$result = array_shift($result);
		}

		return (empty($result)) ? $default : $result;	
	}
	
	/**
	 * Получение столбца таблицы.
	 */
	public static function getColumn($query, $param = array())
	{
		self::$sth = self::getDbh()->prepare($query);
		self::$sth->execute((array) $param);
		return self::$sth->fetchAll(PDO::FETCH_COLUMN);	
	}
}
PHP
2

Получение одной записи из БД

$item = DB::getRow("SELECT * FROM `category` WHERE `id` = ?", 1);
// Или
$item = DB::getRow("SELECT * FROM `category` WHERE `id` = :id", array('id' => 1));

print_r($item);
PHP

Результат:

Array
(
    [id] => 1
    [parent] => 0
    [name] => Мороженое
)

Получение нескольких записей из БД

$items = DB::getAll("SELECT * FROM `category` WHERE `id` > 2");
print_r($items);
PHP

Результат:

Array
(
    [0] => Array
        (
            [id] => 3
            [parent] => 0
            [name] => Фрукты
        )
    [1] => Array
        (
            [id] => 4
            [parent] => 0
            [name] => Ягоды
        )
    [2] => Array
        (
            [id] => 5
            [parent] => 2
            [name] => Грибы
        )
	...
)

Получения значения

$value = DB::getValue("SELECT `name` FROM `category` WHERE `id` = 2");
print_r($value);
PHP

Результат:

Овощи

Получения значений колонки

$values = DB::getColumn("SELECT `name` FROM `category`");
print_r($values);
PHP

Результат:

Array
(
    [0] => Мороженое
    [1] => Овощи
    [2] => Фрукты
    [3] => Ягоды
    [4] => Грибы
    [5] => Морепродукты
    ...
)

Добавление в БД

Метод возвращает ID вставленной записи.

$insert_id = DB::add("INSERT INTO `category` SET `name` = ?", 'Яблоки');
PHP

Все остальные запросы

Выполняет запросы в БД, такие как DELETE, UPDATE, CREATE TABLE и т.д. В случаи успеха возвращает true.

DB::set("DELETE FROM `category` WHERE `id` > ? AND `parent` > ?", array(123, 0));
PHP
14.03.2018, обновлено 08.10.2021
22803

Комментарии 7

Evgeny Dubrov Evgeny Dubrov
31 января 2021 в 11:32
а если несколько бд? как между ними переключатся?
Eldaeron Eldaeron
18 января 2022 в 18:01
Внимательно посмотрите начало:
Для полного понимание скину такой кусок кода
<?php
class DB
{
	public static $dsn = 'mysql:dbname=table;host=localhost';
	public static $user = 'user';
	public static $pass = 'password';
}

echo DB::$dsn; // mysql:dbname=table;host=localhost

echo '<br>';

echo '<br>';

DB::$dsn = 'mysql:dbname=newtable;host=127.0.0.1';

echo DB::$dsn; // mysql:dbname=newtable;host=127.0.0.1
Gen Man Gen Man
19 января 2024 в 05:53
DB::getValue("SELECT `name` FROM `category` WHERE `id` = 2");
и
DB::getValue("SELECT `name` FROM `category` WHERE `id` = '2aaaaaaaa...'");
Выдаст один результат который будет равняться записи с id 2 в вашей базе.
Т.е. мы указываем идентификатор 2 и после 2 можно вводить любые не числовые символы и выборка будет идентична.
И так не только с getValue но и другими методами.
P.S. баг проявляется если обращаться к столбцу числового типа.
Иван Иван
23 января 2024 в 16:47
Это наверно зависит от типа данных в таблице. Если тип данных int то он буквы проигнорирует. Не?
Gen Man Gen Man
25 января 2024 в 02:14
Да это с int такое. Просто это всё же не совсем правильно получается. Ведь 2 != '2aaaaa'
Иван Иван
23 января 2024 в 16:46
* Добавление в таблицу, в случаи успеха вернет вставленный ID, иначе 0."
А если мы вставляем данные в id=0, то будет успех. И как тогда проверить успех или нет?
Gen Man Gen Man
25 января 2024 в 02:39
Если AUTO_INCREMENT стоит на id и ты передаешь своё значение в id, то вернёт то что ты передал. Вообще это для тех случаев подходит если нужно получить id только что созданной записи.

, чтобы добавить комментарий.

Другие публикации

Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
24588
+7
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
16908
0
Как вывести метки на Яндекс.Картах из MySQL+PHP
В статье рассмотрены примеры как вывести метку на карту из БД и вывод других объектов, которые находятся рядом.
21514
+11
Генерация случайных буквенно-цифровых кодов в PHP
Несколько примеров, как сгенерировать случайные последовательности численных и буквенных строк заданной длины и...
11407
+4
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7123
+7
Шорткоды на регулярных выражениях
Часто на сайтах возникает необходимость вставлять в тексты страниц динамичные информационные блоки – баннеры, телефоны...
5569
+3