SIP Kamailio SQL查询失败问题求助
问题修复方案
核心原因
错误提示unknown command, missing loadmodule是因为你使用的sql_query命令由db_sql模块提供,但配置里仅加载了db_mysql(数据库驱动模块),未加载db_sql模块,导致Kamailio无法识别该命令。
修复步骤
加载
db_sql模块
在WITH_MYSQL条件块中添加db_sql模块的加载语句,确保它与db_mysql一同加载:#!ifdef WITH_MYSQL loadmodule "db_mysql.so" loadmodule "db_sql.so" modparam("db_mysql", "db_url", "mysql://kamailio:Pablo3090@localhost/kamailio") #!endif修复SQL注入风险(强烈建议)
当前查询直接将$rU拼接进SQL语句,存在注入风险,建议改用参数绑定方式:if (sql_query("kamailio", "SELECT contact_domain FROM sip_routing WHERE phone_number=%s", "result", $rU)) {这种方式会自动对变量转义,避免注入攻击。
验证模块加载状态
启动Kamailio时可添加-l参数查看已加载模块,确认db_sql和db_mysql均已加载:sudo kamailio -f /etc/kamailio/kamailio.cfg -l
修改后的完整配置片段
#!ifdef WITH_MYSQL loadmodule "db_mysql.so" loadmodule "db_sql.so" modparam("db_mysql", "db_url", "mysql://kamailio:Pablo3090@localhost/kamailio") #!endif request_route { # Handle SIP OPTIONS (Heartbeat) if (is_method("OPTIONS")) { sl_send_reply(200, "OK"); exit; } if (is_method("INVITE")) { xlog("L_INFO", "Handling INVITE request\n"); # Query the database for the contact domain based on phone number if (sql_query("kamailio", "SELECT contact_domain FROM sip_routing WHERE phone_number=%s", "result", $rU)) { if ($dbr(result=>rows) > 0) { $var(contact_domain) = $dbr(result=>[0][0]); append_to_reply("Contact: <sip:$rU;tgrp=teams_trunk;trunk-context=teams_tk@$var(contact_domain);user=phone>\r\n"); } else { xlog("L_WARN", "No routing found for $rU\n"); } sql_query_free("result"); } else { xlog("L_ERR", "Database query failed!\n"); } sl_send_reply("300", "Multiple Choices"); exit; } }
额外注意事项
- 确保Kamailio安装包包含
db_sql模块,若缺失需重新编译Kamailio并启用DB_SQL编译选项。 - 检查数据库用户
kamailio是否拥有sip_routing表的查询权限,避免因权限不足导致查询失败。
内容的提问来源于stack exchange,提问作者Pablo3090
相关产品推荐
相关产品推荐

