go-db icon indicating copy to clipboard operation
go-db copied to clipboard

autoreplace {} (Even if there is no prefix)

Open eliarhsamos opened this issue 8 years ago • 7 comments

/* Замена {table} */
        if($this->prefix) {
            $query = \preg_replace_callback('~{(.*?)}~', array($this, 'tableClb'), $this->pattern);
        }else{
            $query=$this->pattern;
        }

lifehack

eliarhsamos avatar May 18 '16 06:05 eliarhsamos

Можете поподробнее описать?

mkedo avatar May 30 '16 11:05 mkedo

В запросе конкатенируется фигурная скобка SELECT CONCAT('{',123,":adsf",'}'); Ожидаю, что будет {123:adsf} Однако фигурные скобки пропали Начал рыть - понял, что пускай даже префикс не указан - автозамена по фигурным все равно осуществляется и получается 123:adsf

eliarhsamos avatar May 30 '16 11:05 eliarhsamos

@eliarhsamos, да, но если я пишу запрос SELECT * FROM {table} я предполагаю, что будет вставлено имя таблицы, вне зависимо от того, как на верхнем уровне настроен префикс. А так замены не будет.

vasa-c avatar May 30 '16 11:05 vasa-c

@vasa-c но в выше приведенном примере на казалось бы обычном запросе - фигурные пропадают. Как с этим штатными средствами бороться?

eliarhsamos avatar May 30 '16 12:05 eliarhsamos

@eliarhsamos, понял. Как сказал @vasa-c, {table} должно разворачиваться вне зависимости от того установлен prefix или нет. Вижу пока только одно решение - не использовать фигурные скобки.

Если в CONCAT нет имен колонок то можно так $db->query("SELECT CONCAT(?l)", array(array('{',123,":adsf",'}'))); Если же есть, то $db->query("SELECT CONCAT(?, ?, ?c, ?)", array('{',123,":adsf",'}'));

mkedo avatar May 30 '16 12:05 mkedo

@eliarhsamos ну а если там знак вопроса будет? Весь смысл библиотеки, как раз, чтобы сырых данных в шаблоне не было.

Вобще эти {} древнее легаси, не знаю, пользуется ли кто, можно и убрать.

vasa-c avatar May 30 '16 12:05 vasa-c

@mkedo видимо, да @vasa-c знака вопроса там заведомо нет, нужно было создать json-подобный вариант часть вещей уже под 5.7 mysql работают, часть нет нужен стык https://dev.mysql.com/doc/refman/5.7/en/json.html и осуществляется что-то вроде mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}'); где данные уже через плейсхолдеры обрабатываются а вот обертка подается напрямую

eliarhsamos avatar May 30 '16 12:05 eliarhsamos