Всем привет!Вопрос к знатокам и сочувствующим. Есть такая несложная конструкция в диалплане:
exten => 123,1,DumpChan()
same => n,Exec(${ODBC_reserv()})
func_odbc.conf:
[reserv]
dsn=reservdb
readsql=SELECT dial
from dial where number
='${EXTEN}}'
Таблица mysql:
id number dial
1 123 Goto(test,test123,1)
Запрос проходит, все отлично. Но Астериск получает из БД
Goto(test\,test123\,1)
Естественно с косыми чертами никакого контекста нет и мы никуда не переходим. В связи с этим вопрос - откуда эти черты берутся?И как убрать?
В БД записываю INSERT - все стандартно. Попробовал простым bash скриптом делать выборку - скрипт возвращает все нормально, без косых черт. Ощущение что это сам Астериск добавляет эти линии. Пробовал экранировать в запросе это поле кавычками но все равно добавляется... Может кто сталкивался. Спасибо.
Задан: 2018-11-15 02:17:23 +0400
Просмотрен: 332 раз
Обновлен: Nov 15 '18
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
хорошим тоном использовать в odbc запросе конструкцию SQL_ESC() .
zzuz ( 2018-11-15 02:46:32 +0400 )редактировать[reserv]
dsn=reservdb
readsql=SELECT
dial
from dial wherenumber
='${SQL_ESC(${EXTEN})}'Сразу попробовал так, когда столкнулся с этим багом..все также.
Rockast ( 2018-11-15 11:43:52 +0400 )редактироватьтогда меняйте подход.
zzuz ( 2018-11-15 12:03:48 +0400 )редактироватьТоже примерно так пробовал... Переменная dial в таком случае тоже имеет вид - Goto(test\,test123\,1) То есть функция ODBC уже вытягивает из БД данные в таком виде Goto(test\,test123\,1) Вне зависимости от того какой переменной их присвоить и т.д....
Rockast ( 2018-11-15 12:31:10 +0400 )редактироватьНу тогда по хардкору
zzuz ( 2018-11-15 15:32:33 +0400 )редактировать${REPLACE(${dial},"\,",",")}
Офигенно вы пишите. Неэкранированный запрос и сразу его в exec, ага. Шикарно, я считаю.
meral ( 2018-11-15 16:42:52 +0400 )редактироватьПодскажите,как правильно сделать в таком случае? Уже не первый раз сталкиваюсь с такими "фишками" Астера... Когда какая-то функция берет данные, например из БД, по одной ей ведомой логике..
Rockast ( 2018-11-22 13:16:12 +0400 )редактироватьВам выше написали как. Правильно - спросить того дятла, который придумал "какого *я". И переписать полностью. Вы задолбаетесь баги в таком "решении" вылавливать в production.
meral ( 2018-11-23 13:18:42 +0400 )редактироватьЭто не "фишки астера", это способности "разработчика". Правила же не дураки придумали. БД не должно содержать куски следующего уровня(диалплан), нужно разделять.
meral ( 2018-11-23 13:19:30 +0400 )редактироватьВот представим ситуацию. У вас в БД записана команда с маааленькой ошибкой, изза чего она не выполняется. Как вы думаете, какой будет результат? Как вы это отследите? Особенно если в выражении были переменные.
meral ( 2018-11-23 13:22:42 +0400 )редактировать