数据库名称含连字符执行SQL查询报错,请求排查问题原因
问题分析与解决方案
代码核心问题
- 未正确处理数据库标识符的特殊字符
MariaDB/MySQL中,包含连字符(-)、空格这类特殊字符的数据库名,必须用反引号(`)包裹,否则SQL解析器会把连字符误判为减号,直接触发语法错误。
- 代码里的
{raw:db_name}是直接输出未转义的数据库名,没有添加必要的反引号,导致带连字符的库名解析失败。 else分支直接拼接$db_name字符串,同样没做标识符转义,不仅会触发相同语法问题,还存在SQL注入风险。
修复后的代码方案
无需区分库名是否包含点号,直接用SMF内置的标识符转义机制即可:
$result = $smcFunc['db_query']('', "SHOW TABLE STATUS FROM `{identifier:db_name}`", array('db_name' => $db_name));
也可以手动调用SMF的标识符转义函数实现:
$escaped_db_name = $smcFunc['db_escape_identifier']($db_name); $result = $smcFunc['db_query']('', "SHOW TABLE STATUS FROM $escaped_db_name", array());
补充说明
{identifier:xxx}是SMF的专用占位符,会自动为标识符添加反引号并完成转义,适配不同数据库的语法规则。- 用
db_escape_identifier函数手动转义,也能确保数据库名被正确包裹,彻底避免语法错误和注入风险。
内容的提问来源于stack exchange,提问作者vince titus
相关产品推荐
相关产品推荐

