Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание экземпляра класса.
Но имеет и ряд недостатков:
- Необходимо запоминать название методов.
- При ошибке в запросе PHP покажет неправильное место где произошла ошибка, что усложняет отладку.
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);
}
}
Получение одной записи из БД
$item = DB::getRow("SELECT * FROM `category` WHERE `id` = ?", 1);
// Или
$item = DB::getRow("SELECT * FROM `category` WHERE `id` = :id", array('id' => 1));
print_r($item);
Результат:
Array
(
[id] => 1
[parent] => 0
[name] => Мороженое
)
Получение нескольких записей из БД
Результат:
Array
(
[0] => Array
(
[id] => 3
[parent] => 0
[name] => Фрукты
)
[1] => Array
(
[id] => 4
[parent] => 0
[name] => Ягоды
)
[2] => Array
(
[id] => 5
[parent] => 2
[name] => Грибы
)
...
)
Получения значения
Результат:
Овощи
Получения значений колонки
Результат:
Array
(
[0] => Мороженое
[1] => Овощи
[2] => Фрукты
[3] => Ягоды
[4] => Грибы
[5] => Морепродукты
...
)
Добавление в БД
Метод возвращает ID вставленной записи.
Все остальные запросы
Выполняет запросы в БД, такие как DELETE
, UPDATE
, CREATE TABLE
и т.д. В случаи успеха возвращает true
.
Для полного понимание скину такой кусок кода
и
DB::getValue("SELECT `name` FROM `category` WHERE `id` = '2aaaaaaaa...'");
Выдаст один результат который будет равняться записи с id 2 в вашей базе.
Т.е. мы указываем идентификатор 2 и после 2 можно вводить любые не числовые символы и выборка будет идентична.
И так не только с getValue но и другими методами.
P.S. баг проявляется если обращаться к столбцу числового типа.
А если мы вставляем данные в id=0, то будет успех. И как тогда проверить успех или нет?