The only proper guide on PDO (eng.)

Вурдалак

Продвинутый новичок
Предлагают делать это руками в описании entity. Не, вариант, конечно, хорошо, что большинство баз понимает квотирование " кроме своих кастомных.
На самом деле, `foo` в Doctrine в meta — это, насколько помню, не прямое экранирование. Это просто признак для Doctrine, что поле нужно экранировать, т.е. backtick'и удаляются и вызывается quoteIdentifier() в соответствии с СУБД.
 

snowdrop

Новичок
Я в детали не вдавался, но звучит достаточно странно
https://github.com/doctrine/dbal/pull/146

Это просто признак для Doctrine, что поле нужно экранировать, т.е. backtick'и удаляются и вызывается quoteIdentifier() в соответствии с СУБД.
Всё в точности так.
 

Фанат

oncle terrible
Команда форума
Мне кажется, тут стоило бы уточнить, что это справедливо лишь для mysql, т.к. в других СУБД как ограничивающий символ, так и правила его экранирования другие.
Спасибо, исправил.

Вообще там конечно ад в смысле совместимости с другими БД, что сильно снижает ценность материала.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
не так давно вылезла новая проблема с PDO

старик Postgres в какой-то момент осознал, что он на самом деле NoSQL, как монга. Казалось бы, ориентация - личное дело каждого проекта, но для смены оной к постгресу стали с хирургической элегантностью пришивать новые операторы.
https://www.postgresql.org/docs/9.5/static/functions-json.html

В числе этих операторов есть ?| и ?&.
А знак вопроса авторы PDO захардкодили как плейсхолдер. Использовать pg с pdo стало неудобно.
Конечно, постгрес осознал себя nosql только в 2014, а PDO-то писали на 10 лет раньше, но проблема в том, что этим PDO никто уже давно не занимается.

Движок переписали полностью, а PDO и SPL стали серьезным куском legacy
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
@grigori, у кого новая, а у кого и не очень!

PHP:
        // Why stored procedure?
        // 1) the JSONB GIN operators are ?| and ?&. See the '?'s? Try to use these operators with PDO. Oops.
        // 2) Yes there are functions like jsonb_exists_all. No GIN index then, seqscan. Oops.
Я тогда сильно матерился. Даже во внутря PDO залез, хотел добавить экранирование, но там не так просто.
 

fixxxer

К.О.
Партнер клуба
Я не уверен, что индексы с кастомными операторами будут работать.

Вот там есть коммент
Index on jsonb field is not used with this approach
, правда, я не понял, он про операторы или про прямой вызов функции. Кажется, про операторы.

Ну и вообще, это уже как-то слишком :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
использование индексов достаточно легко проверить
а еще надо Бартунова поймать и спросить, в чью светлую голову пришло делать операторы со знаком вопроса, и когда этим их json можно будет пользоваться из php фреймворков
 

fixxxer

К.О.
Партнер клуба
использование индексов достаточно легко проверить
Для функций проверял - не работает. С кастомными операторами, которые вяжутся на функции, с чего бы иначе по идее? Хотя, признаюсь, такой дикий изврат с кастомным оператором мне в голову не пришел тогда. В итоге завернул в хранимку и фиг бы с ним, хотя она, конечно, страшная получилась.

а еще надо Бартунова поймать и спросить, в чью светлую голову пришло делать операторы со знаком вопроса, и когда этим их json можно будет пользоваться из php фреймворков
Ну вообще лучше спросить разработчиков PDO, в чью светлую голову пришло не сделать экранирование, хотя бы в виде ??. В JDBC же догадались. А в постгресе нативные плейхолдеры в виде $1.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Блин, вот кто так пишет?

https://github.com/php/php-src/blob/master/ext/pdo/pdo_sql_parser.re#L83

"magic/hack", блин :)

С re2c понятно, а вот что в этом scan происходит вообще, а? Нифига не понял даже где там PDO_PARSER_TEXT обрабатывается. Вот в 5.6 есть закомментированный через #if 0 old_pdo_parse_params, там понятно все, только давно не используется.

Короче, няня, я у них поел
 

Вурдалак

Продвинутый новичок
а еще надо Бартунова поймать и спросить, в чью светлую голову пришло делать операторы со знаком вопроса, и когда этим их json можно будет пользоваться из php фреймворков
Действительно, поймать и спросить: «ти пачиму pdo ни уважаеш? мы тибе что, JDBC что ли, чтобы экранировать???».
 

fixxxer

К.О.
Партнер клуба
Самое веселое, что "??" емитится как есть. Двумя вопросами, как плейсхолдер не интерпретируется.

Видать, вот это:
PHP:
MULTICHAR	= ([:]{2,}|[?]{2,});
Догадываюсь, почему так. :: - это кастинг в постгресе, а ?? до кучи туда же. Ну плюс там еще этот "магический хак" с ? -> : pdoN туда-обратно.

Причем ведь кто-то мог на это завязаться, так что ?? -> literal ? будет BC break.

Похоже, единственная комбинация, с которой не будет BC break - это :? -> literal ?

Попробую понять, как это туда всунуть.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ну вообще лучше спросить разработчиков PDO, в чью светлую голову пришло не сделать экранирование, хотя бы в виде ??. В JDBC же догадались. А в постгресе нативные плейхолдеры в виде $1.
И кто это теперь должен поддерживать, когда фреймворки полагаются на PDO. Ни в доктрине, ни в Yii нет поддержки старого расширения postgres.

Причем ведь кто-то мог на это завязаться, так что ?? -> literal ? будет BC break.

Похоже, единственная комбинация, с которой не будет BC break - это :? -> literal ?

Попробую понять, как это туда всунуть.
Я бы забил на BC break и делал нормально. А то :? тоже будет оператором
 
Сверху