Fake named placeholders

Фанат

oncle terrible
Команда форума
У меня сейчас есть некое подобие класса для работы с БД с собственными плейсхолдерами.
Про парсер от него я уже задавал вопрос здесь, но не могу найти обратно даже гуглём.

Но, собственно, вопрос вот в чём: плейсхолдеры у меня типизованные, но анонимные.
то есть, указывается тип, но не указывается имя
PHP:
SELECT * FROM table WHERE uid=?i limit ?i,?i
Это бывает неудобно, когда плейсхолдеров много.

Как вариант - именованные плейсхолдеры как в PDO -

PHP:
SELECT * FROM table WHERE uid=:uid LIMIT :start,:limit
но в этом случае теряется вся прелесть работы с однострочными хелперами:
PHP:
$data = $db->getArr($sql,$uid,$start,$limit);
- без плясок с бубном мы эти переменные к своим плейсхолдерам не привяжем.

И тут возникает идея - а не рассматривать ли эти имена не в качестве индекса для привязки к переменной, а просто в качестве комментария?

то есть, итоговый код будет выглядеть вот так примерно
PHP:
$sql = "SELECT * FROM table WHERE uid=int:uid LIMIT int:start,int:limit";
$data = $db->getArr($sql,$uid,$start,$limit);
но при этом никакой связи между плейсхолдерами и переменными, кроме последовательности их указания.

Вопрос: не будет ли это только запутывать разработчика и смешивать переменные?
 

fixxxer

К.О.
Партнер клуба
А чем плохо
PHP:
$sql = "SELECT * FROM table WHERE uid=int:uid LIMIT int:start,int:limit";
$data = $db->getArr($sql, compact('uid', 'start', 'limit'));
?

Обычно у меня такой проблемы не возникает, т.к. почти всегда все уже и так заранее завернуто в массив.
 
  • Like
Реакции: eax

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
А я привык к своему:
PHP:
$this->sql->fetchAll("SELECT * FROM table WHERE uid=:uid LIMIT ...", array(':uid' => $uid));
Идея с int: интересная
 

AmdY

Пью пиво
Команда форума
тогда ещё для неименованых делать?
WHERE uid = int:? AND name = string:?
 

AmdY

Пью пиво
Команда форума
Breeze
считать? чем тогда это от именования отличается?
 

Breeze

goshogun
Команда форума
Партнер клуба
Breeze
считать? чем тогда это от именования отличается?
ничем, просто явное указывание элемента.
при использовании ? ? ? так или иначе предполагается некий порядок.

гипотетически, если рассмотреть такой пример:
PHP:
$sql = "select id from s:? where s:?=s:? and static_field=s:? order by s:?";
$result = $db->getArr($sql, $table_name, $field1_name, $field1_value, $static_field_value, $field1_name);
можно не передавать два раза $field1_name
PHP:
$sql = "select id from s:? where s:?=s:? and static_field=s:? order by s:1";
считай, что просто хинт для неименованных, используя возможность именования.
 

SiZE

Новичок
Единственное, что смущает с неименованными, всегда порядок верный указывать переменных. Стоит ли на это вообще заморачиваться?
 

Breeze

goshogun
Команда форума
Партнер клуба
Единственное, что смущает с неименованными, всегда порядок верный указывать переменных. Стоит ли на это вообще заморачиваться?
а почему бы и нет? если библиотека позволит работать с обоими вариантами, то хуже не будет.
но ИМХО гораздо важнее простая возможность добавить свой плейсхолдер, если таковой отсутствует.
 
Сверху