Обновление Bounty. Уже получил очень хороший ответ от Марка. Адаптировано: = в:, ниже. Тем не менее, я все еще ищу аналогичные схемы, кроме DBIx. Я просто заинтересован в совместимости с чем-либо.
Мне нужно сообщить о синтаксисе, который я выбрал для "расширенных" заполнителей в параметризованных операциях SQL. Поскольку создание некоторых конструкций (предложения IN) вызывало меня, я решил использовать несколько ярлыков синтаксиса, которые автоматически расширяются до обычных? заполнители.
Они мне нравятся. Но я хочу упаковать его для распространения и задаюсь вопросом, легко ли они понятны.
В основном мои новые заполнители: ?? и :? (перечислены параметры) и :& и :, и :| и :: (для именованных заполнителей) со следующими вариантами использования:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
?? расширяется в ?,?,?,?,?,... в зависимости от числа $args к моей функции db(). Это довольно ясно, и его синтаксис уже является стандартизированным. Perls DBIx:: Simple также использует его. Поэтому я вполне уверен, что это приемлемая идея.
-> db(" SELECT :? FROM any WHERE id>0 ", ["title", "frog", "id"]);
// Note: not actually parameterized attr, needs cleanup regex
Признай это. Мне просто понравился смайлик. В основном этот заполнитель :? расширяет ассоциативные $args в имена простых столбцов. Фактически это исключает любые значения $args. Это действительно полезно для INSERT в сочетании с??, а иногда и для предложений IN. Но здесь я уже задаюсь вопросом, является ли этот новый синтаксис разумным, или не просто неправильным, потому что он смешивает: и? персонажи. Но почему-то это похоже на синтаксическую схему.
-> db(" UPDATE some SET :, WHERE :& AND (:|) ", $row, $keys, $or);
Здесь мнемонический :, расширяется в список пар name=:name, разделенных запятыми ,. В то время как :& представляет собой столбец =: список столбцов, объединенный AND s. Для контроля четности я добавил :|.: & имеет другие варианты использования из команд UPDATE.
Но мой вопрос заключается не в пользе, а в том, что:, и: & кажется, запоминаются?
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
После некоторого, хотя я также добавил :: для интерполяции :named,:value,:list, очень похожая на ??, расширяется до ?,?,?. Подобные варианты использования и разумные для равномерности.
В любом случае, кто-нибудь еще реализовал такую схему? Разные заполнители? Или что бы вы порекомендовали для простоты? Обновление: Я знаю, что интерфейс Oracle OCI для PHP также может связывать параметры массива, но не использует для этого специальные заполнители. И я ищу сопоставимые синтаксисы заполнителей.