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);
но при этом никакой связи между плейсхолдерами и переменными, кроме последовательности их указания.

Вопрос: не будет ли это только запутывать разработчика и смешивать переменные?
 
А чем плохо
PHP:
$sql = "SELECT * FROM table WHERE uid=int:uid LIMIT int:start,int:limit";
$data = $db->getArr($sql, compact('uid', 'start', 'limit'));
?

Обычно у меня такой проблемы не возникает, т.к. почти всегда все уже и так заранее завернуто в массив.
 
  • Like
Реакции: eax
А я привык к своему:
PHP:
$this->sql->fetchAll("SELECT * FROM table WHERE uid=:uid LIMIT ...", array(':uid' => $uid));

Идея с int: интересная
 
тогда ещё для неименованых делать?
WHERE uid = int:? AND name = string:?
 
Breeze
считать? чем тогда это от именования отличается?
 
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";

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

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