You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库名称含连字符执行SQL查询报错,请求排查问题原因

问题分析与解决方案

代码核心问题

  1. 未正确处理数据库标识符的特殊字符
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:00:00