我正在努力从软件电话获取号码,然后插入 mysql 数据库。 所有驱动程序和东西都很好。我配置它们。我可以选择/轮询我的所有数据。但我无法插入我的新数据。我的 func_odbc.conf 喜欢这样;
[ADDX];
dsn=asterisk
writesql = INSERT INTO aktarma (musterino,aktartel) values (${VAL1},${VAL2})
我的extensions.conf是;
exten=>_X.,n(sqlekle),SET(a=${ODBC_ADDX(${digit},${aktartel})})
我检查了我的变量 ${digit} 和 ${aktartel} 是正确的,它给出的错误为;
[Jan 30 05:43:21] ERROR[4601]: pbx.c:3380 ast_func_read: Function ODBC_ADDX cannot be read
-- Executing [XXXXXXXXX@phones:30] Set("SIP/out-0000001a", "a=") in new stack
那么朋友们有什么问题吗?我找不到解决这个问题的方法 非常感谢。
虽然晚了一年,但我会回答这个问题,以帮助像我一样来自搜索领域的人。
在 func_odbc.conf 中,您尝试编写
VAL1
和 VAL2
但实际上您想使用 ARG1
和 ARG2
;在接下来的拨号方案中,VAL1
和VAL2
未设置(它们将出现在=
之后)
[ADDX]
dsn=asterisk
writesql = INSERT INTO aktarma (musterino,aktartel) VALUES (${ARG1},${ARG2})
还有一点要注意,转义并引用 SQL 输入始终是一个好习惯;你永远不知道什么时候某个混蛋会在他的 DTMF 键盘上按“A”,只是为了让你保持警惕!在您的查询中使用
'${SQL_ESC(${ARG1})}'
:
INSERT INTO aktarma (musterino, aktartel) VALUES ('${SQL_ESC(${ARG1})}', '${SQL_ESC(${ARG2})}')
继续讨论您的拨号计划:您试图从只是一个写入函数的函数中读取一个值。即使您没有读取值,您仍然需要在 Set 命令中使用
=
以避免错误,但它应该位于末尾。而且该函数不需要包裹在 ${}
中进行编写。
exten=>_X.,n(sqlekle),Set(ODBC_ADDX(${digit},${aktartel})=)
关于 ARG 与 VAL,以下是同时使用两者的示例:
[ADDX]
dsn=asterisk
writesql = INSERT INTO aktarma SET ${ARG1}='${VAL1}', ${ARG2}='${VAL2}'
我们同时使用VAL和ARG;然后将其放入拨号方案中:
exten=>_X.,n(sqlekle),Set(ODBC_ADDX(musterino,aktartel)=${digit},${aktartel})
因此
ARGx
作为参数传递给函数,而 VALx
位于 Set
调用的右侧。
关于其工作原理的可用文档很少;希望这对某人有帮助。
您在分配的左侧部分使用了只写函数。
[PRESENCE]
dsn=mydb
writesql=UPDATE `locationtable` SET `location`=${SQL_ESC(${VAL1})}` WHERE `username`='${SQL_ESC(${ARG1})}'
扩展.conf:
exten => 1234,1,NoOp(Set and read location)
exten => 1234,n,Set(ODBC_PRESENCE(${EXTEN})=office)
奇怪的是,我无法使用 writesql='' 更新数据库,但 readsql='' 得到执行。星号版本 18
所以我最终使用了下面的 func_odbc.conf
[myfunction2]
prefix=ODBC
writehandle=MySQL-asterisk
readsql=UPDATE callog SET caller=${SQL_ESC(${ARG1})} WHERE id='11'