Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89

Обертка для PDO

01.10.2016, 22:54. Показов 2843. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел на http://phpfaq.ru/pdo/pdo_wrapper простую обертку.
Но не совсем понял, как она работает.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHAR', 'utf8');
 
class DB
{
    protected static $instance = null;
 
    public function __construct() {}
    public function __clone() {}
 
    public static function instance()
    {
        if (self::$instance === null)
        {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => TRUE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
        }
        return self::$instance;
    }
    
    public static function __callStatic($method, $args)
    {
        return call_user_func_array(array(self::instance(), $method), $args);
    }
 
    public static function run($sql, $args = [])
    {
        $stmt = self::instance()->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}
Там есть примеры запросов:
PHP
1
2
3
DB::query("CREATE temporary TABLE pdowrapper (id int auto_increment primary key, name varchar(255))");
$name = DB::run("SELECT name FROM pdowrapper WHERE id=?", [$id])->fetchColumn();
$stmt = DB::run("UPDATE pdowrapper SET name=? WHERE id=?", [$new, $id]);
Но мне надо составить запрос подобный этому:
PHP
1
$row = PDOExtended::run("INSERT INTO ? (name, quantity, id_m, item) VALUES(?, ?, ?, ?)" , [$server, $login, $quantity, $id, $item]);
Этот выдает ошибку:
HTML5
1
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''cat_classic' (name, quantity, id_m, item) VALUES('Vasilisk', '20', '265', 'Ал' at line 1 in C:\news-pc.ru\domains\localhost\app\PDOExtended.php:33 Stack trace: #0 C:\news-pc.ru\domains\localhost\app\PDOExtended.php(33): PDOStatement->execute(Array)
П.С. Класс у меня PDOExtended называется.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2016, 22:54
Ответы с готовыми решениями:

Функция для PDO execute
Всем привет. Есть функция, которая автоматически собирает значения в инпутах и формирует часть запроса в бд, выглядит она так: function...

Класс для работы с БД на PDO классе
Хотел написать метод для вызова одной строки, но что-то идёт не так. Выдаёт ошибку: &quot;Fatal error: Uncaught Error: Call to undefined...

PDO для Денвера - возможно ли это?
Только что начал изучать PDO и столкнулся с проблемой - а можно ли установить расширение PDO_MYSQL не на винду, а на Денвер? Я работаю с...

18
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.10.2016, 00:24
насколько я помню имя таблицы и имена столбцов нельзя подставлять с помощью автозамены (?)
INSERT INTO table_name
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.10.2016, 00:35  [ТС]
Но в этом случае и от всей авто замены нет толка, если все равно придется фильтр писать..
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
02.10.2016, 00:57
Лучший ответ Сообщение было отмечено Vassillissk как решение

Решение

PHP
1
$row = PDOExtended::run("INSERT INTO $server (name, quantity, id_m, item) VALUES(?, ?, ?, ?)" , [$login, $quantity, $id, $item]);
при этом $server вы должны проверять сравнивать с возможными таблицами, чтоб не получить инъекцию
1
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.10.2016, 01:06  [ТС]
Спасибо. Не думал о проверке сравнением.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
02.10.2016, 01:09
Лучший ответ Сообщение было отмечено Vassillissk как решение

Решение

Цитата Сообщение от Vassillissk Посмотреть сообщение
Но в этом случае и от всей авто замены нет толка
имена таблиц/столбцов не должны приходить от пользователя - максимум из конфига.
1
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
02.10.2016, 01:59  [ТС]
Учту.
0
02.10.2016, 07:34

Не по теме:

Цитата Сообщение от Vassillissk Посмотреть сообщение
простую обертку
Мягко говоря так себе обертка

0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 996
02.10.2016, 21:30
Vassillissk, https://github.com/mvcbox/sql-query
Описание на русском.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
18.10.2016, 06:09  [ТС]
У меня наконец дошли руки до вашей обертки. Действительно удобно сделано. Вот только composer require mvcbox/sql-query пишет, что пакет не найден (
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
18.10.2016, 08:42
Custos, а зачем выбор драйверов прямо в функции qb? Считаю, что лучше сделать менеджер драйверов.
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
18.10.2016, 11:54  [ТС]
Автор наверное обидится, но я вообще выбор драйверов вырезал (
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 996
18.10.2016, 12:06
Para bellum, функция для древнего кода, где нет ни автозагрузки, ни других "прелестей". То есть сделано для тех, кому привычным делом является скачать файлик, сделать include или require и пользоваться.

Добавлено через 3 минуты
Vassillissk,
Bash
1
php composer.phar require mvcbox/sql-query:dev-master
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
18.10.2016, 17:17
Цитата Сообщение от Vassillissk Посмотреть сообщение
Автор наверное обидится, но я вообще выбор драйверов вырезал
А зачем? В том-то и дело, что Query Builder'ы строятся без привязки к конкретной базе.
Цитата Сообщение от Custos Посмотреть сообщение
функция для древнего кода
Не понял. Разве есть её аналог? Всё же через неё.
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 996
18.10.2016, 17:34
Цитата Сообщение от Para bellum Посмотреть сообщение
Не понял. Разве есть её аналог? Всё же через неё.
Да, я просто это не указывал в доках) Можно самому ручками создать объект

Добавлено через 1 минуту
Хотел привести доки в порядок, но все никак не найду время
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
19.10.2016, 07:04
Вы извиняйте, что докапываюсь. Но какой объект? Непосредственно какого-то класса из этих: MysqlQuery / PgsqlQuery / SqliteQuery?
0
1 / 1 / 0
Регистрация: 12.12.2015
Сообщений: 89
19.10.2016, 08:43  [ТС]
Я function.qb.php в статический метод обернул.

Добавлено через 10 минут
А вообще я тут про redbeanphp узнал, только сложно (
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 996
19.10.2016, 10:07
Цитата Сообщение от Para bellum Посмотреть сообщение
Вы извиняйте, что докапываюсь. Но какой объект? Непосредственно какого-то класса из этих: MysqlQuery / PgsqlQuery / SqliteQuery?
Любого из них В зависимости от СУДБ
Можно было, конечно, использовать один класс для всех СУБД, но этой реализации уже около 4 лет и я не стал ничего менять, а залил на GitHub почти в изначальном варианте.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
19.10.2016, 12:04
Цитата Сообщение от Custos Посмотреть сообщение
Любого из них. В зависимости от СУДБ
О, что и предполагал услышать. В таком случае мы перестаём следовать основам ООП, поскольку нет полиморфизма. То есть, мы жёстко привязываем наш клиентский код (тот, что будет использовать Ваш Query Builder) к конкретной реализации.
В общем, к чему веду. Я бы функцию qb всё же оставил и сделал дополнительный класс, для которого эта функция просто служила бы helper'ом.
И для выбора драйвера сделал бы класс-менеджер.
Скажем, примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
/**
* Для преобразования строки в "camelCase"
* 
* @param string $value
* 
* @return string
*/
function str_camel($value){
    $value = ucwords(str_replace(['-', '_'], ' ', $value));
    
    return str_replace(' ', '', $value);
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 * Базовый класс для всех менеджеров.
 * На данный момент используется только DatabaseManager
 */
abstract class Manager
{
    /**
     * Получение объекта драйвера.
     * 
     * @param string $name 
     * 
     * @throws \DomainException
     * 
     * @return object
     */
    public function driver($name)
    {
        $name = str_camel($name);
        
        $method = "get{$name}Driver";
        
        if(!method_exists($this, $method))
            throw new DomainException("The driver [$name] could not be found");
            
        return $this->$method();
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class DatabaseManager extends Manager
{
    protected function getMysqlDriver()
    {
        return new MysqlQuery;
    }
    
    protected function getPgsqlDriver()
    {
        return new PgsqlQuery;
    }
    
    protected function getSqliteDriver()
    {
        return new SqliteQuery;
    }
}
Потом так же получаем из настроек имя драйвера и получаем объект:
PHP
1
2
3
$manager = new DatabaseManager;
 
$qb = $manager->driver($config['driver']);
Так как-то, в общем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2016, 12:04
Помогаю со студенческими работами здесь

один PDO для quote() и queru();
как создать новое PDO для использования функции quote() в примерах нашел такую реализацию: $conn = new...

PDO - одно значение для нескольких параметров
Здравствуйте! Запрос содержит несколько параметров, которым присваивается одно и то же значение: $result = ... update table set...

PDO::prepare для нескольких строк SQL
sql содержит несколько строк кода, можно их выполнить одним приемом, или нужно для каждой строки sql писать свой код pdo? мой код...

Использовать MySQLi или PDO для POST запроса
Всем привет господа. Помогите с POST запросом. Есть база Есть регистрация на сайте &lt;?php error_reporting(E_ALL); ...

Как создать запрос PDO для записи данных в базу
Как создать запрос PDO что бы данные записались в базу? Например: Есть таблица пользователей с полями name|lastname|city|godrogden ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru