Какой формат именованного типизованного плейсхолдера выбрать?

hell0w0rd

Продвинутый новичок
Absinthe
queryBuilder - фактически представляет обертку для запроса, а значит можно сделать например глобальные именованные параметры, которые определяются для всего запроса в целом
 

Absinthe

жожо
Ну, в первую очередь потому, что ПДО - фигня на палочке и недоделка. Проще новых нарожать, чем этих отмыть.
PHP тоже. Но мы же его используем. И отмывают его постепенно.

Ты не пробовал, кстати, наследовать ПДО? Увлекательное занятие.
Не было проблем.

В том-то и дело, что у ПДО нет нормального интерфейса. Все эти припарки-екзекюты-фетчи. Идея интерфейса как раз в том, чтобы весь этот мусор из кода вышвырнуть.
Это все можно обернуть
 

Absinthe

жожо
Absinthe
queryBuilder - фактически представляет обертку для запроса, а значит можно сделать например глобальные именованные параметры, которые определяются для всего запроса в целом
Сложный запрос через QB не построишь, либо потратишь гораздо больше времени.
А именно в сложных запросах нужны именованные параметры.
 

fixxxer

К.О.
Партнер клуба
Фанат
__call. ну или просто делегирование, наследоваться, да, не очень удобно.

Но это надо делать отдельной опциональной фишкой, у pdo прямо скажем не самый удобный интерфейс.
 

Фанат

oncle terrible
Команда форума
Фанат
__call. ну или просто делегирование, наследоваться, да, не очень удобно.
Ну да, мы ж это уже обсуждали. просто там еще какие-то косяки полезли - я и забил.

Кость, ты лучше вот что скажи.
вот у нас есть два способа вызвать функцию:
PHP:
//как у меня сейчас - с переменным числом параметров
$data = $db->getCol("SELECT name FROM t WHERE id IN(?a)",array(1,2,3));
//и как в пдошечке - массивом
$data = $db->getCol("SELECT name FROM t WHERE id IN(?a)",array(array(1,2,3)));
Вот есть какой-нибудь способ отличить одно от другого, не плодя функции, не делая переключатели и сохранив обратную совместимость.
Я уж блин и сам не рад, что выкинул массив. сейчас же ведь и того проще писать - всег две скобки квадратные
Как бы его впихнуть обратно?
 

ksnk

прохожий
PHP:
//как у меня сейчас - с переменным числом параметров
$data = db('DbSimpleStyle')->getCol("SELECT name FROM t WHERE id IN(?a)",array(1,2,3));
//и как в пдошечке - массивом
$data = db('PdoStyle')->getCol("SELECT name FROM t WHERE id IN(?a)",array(array(1,2,3)));
?
Или так - всего один метод дописать:
PHP:
//как у меня сейчас - с переменным числом параметров
$data = $db->setStyle('DbSimple')->getCol("SELECT name FROM t WHERE id IN(?a)",array(1,2,3));
//и как в пдошечке - массивом
$data = $db->setStyle('Pdo')->getCol("SELECT name FROM t WHERE id IN(?a)",array(array(1,2,3)));
 

fixxxer

К.О.
Партнер клуба
Фанат
я только черезжопный способ вижу:

если
1) аргумент один и это массив
3) и при этом первый плейсхолдер это ?a
то проверять является ли первый элемент первого аргумента тоже массивом :D
 

WMix

герр M:)ller
Партнер клуба
Для подобного как мне кажется нужен querybuilder, но простота библиотеки тогда уменьшается)
или лучше под sql заточенный twig ;)
PHP:
$data = $db->getCol("
    selelt * 
    from {{users_table:identifier}}
    where id={{user_id:int}}
  ", array('users_table'=>'users','user_id' => 42)
);
 

ksnk

прохожий
WMix Для твиговой стилистики было бы правильнее | использовать
PHP:
from {{users_table|identifier}}
Хотя проблем топикстартера оно никак не решит. ;)
 

WMix

герр M:)ller
Партнер клуба
вот только не нужно в идею какать! вертикальная черточка это оператор :D
PHP:
 from {{users_table:identifier|lower}}
 

hell0w0rd

Продвинутый новичок
Хы:) Как шаблоны писать - так польем гавном твиг, как оформить плейсхолдеры на 100 символов максимум - возьмем твиг))
По моему именованные плейсхолдеры правильнее считать за переменные внутри запроса, а синтаксис приведения переменной нам знаком:
PHP:
$data = $db->getCol("
    selelt * 
    from (id)users_table
    where id=(int)user_id
  ", array('users_table'=>'users','user_id' => 42)
);
Ну и с кверибилдером можно было бы это сделать как-то так:
PHP:
use DbSimle\Type;

$db->newQuery('selelt * 
    from :users_table
    where id=:user_id')
    ->set('users_table', 'users', Type::ID)
    ->set('user_id', 25, Type::INT)
Или так
PHP:
$db->newQuery('selelt * 
    from :users_table
    where id=:user_id')
    ->setId('users_table', 'users')
    ->setInt('user_id', 25)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Фанат
я что-йто не пойму твоих проблем. PDO заэкстендить - запросто, а вот с PDOStatement, который все делает, как-раз полный облом, и справиться реально сложно.
Я сейчас хочу попробовать traits - если прокатит, это будет решением, и плевать на 5.3 :)

Каким синтаксисом передавать значения параметров - да пофиг. Сделай поддержку обоих вариантов: $Db->bindValue() и $Db->query($sql,['a'=>1,'b'=>2])
bindParam - стремная штука, я зарекся ее использовать

PHP:
$data = $db->getCol("SELECT name FROM t WHERE id IN(?a)",array(1,2,3));
лучше выкини такой шоткат: это такой классный способ выстрелить в ногу, что ну его нафиг
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если это одна из основных идей ... хм, тогда ... тогда все-равно выкинь его :) ну, это мое личное мнение:
так много проблем, и так мало пользы
 

hell0w0rd

Продвинутый новичок
здесь: http://php.net/manual/en/pdo.prepare.php

захардкоденая зависимость классов
Так вы даже не посмотрели строку на которую я вам ссылку дал:) Раз уж по ссылке лень пройти:
PHP:
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Doctrine\DBAL\Driver\PDOStatement', array()));
Строка из доков по PDO
PDO::ATTR_STATEMENT_CLASS: Задает пользовательский класс производный от PDOStatement. Атрибут нельзя использовать с PDO, использующими постоянные соединения. Принимает массив array(string classname, array(mixed constructor_args)).
PS я-то думал проблема в том что нельзя использовать 1 ключ на несколько вставок
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
hell0w0rd это меняет дело! я смотрел по ссылке, но не врубился
PS я-то думал проблема в том что нельзя использовать 1 ключ на несколько вставок
а зачем?

В обёртке это обходится декоратором.
декоратор - то понятно, но надо чтобы класс наследовался от PDOStatement, иначе он не пройдет по typehinting, т.о. надо расширить PDOStatement и переопределить все его методы, чтобы сделать декоратор к PDOStatement :)
 
Сверху