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

PHP7兼容升级:修复SQL语法near ')' at line 1报错问题

错误根因

该SQL语法报错是PHP7升级适配时的典型类型校验兼容问题:

  • 报错位置在IN ()子句段:当$this->config->get('glami_size_options')返回空值、空数组、非数组类型(比如null/false)时,PHP5版本下implode()会静默返回空字符串,最终拼接出IN ()的非法SQL结构;PHP7+强化了参数类型校验,要么触发类型错误抛出未捕获异常,要么拼出空IN括号触发SQL语法错误,最终返回right syntax to use near ')'的报错。
修复方案

对IN子句的入参做类型兜底、空值判断,同时补充必要的参数转义避免SQL注入风险,可直接替换原有代码:

// 读取配置并做类型兜底,保证传入implode的参数一定是数组类型
$glami_size_options = $this->config->get('glami_size_options');
if (!is_array($glami_size_options)) {
    $glami_size_options = [];
}

// 非空时拼接合法IN条件,空数组时用恒假条件兜底,避免出现IN()空括号语法错误
$in_clause = empty($glami_size_options)
    ? " AND 1=0"
    : " AND pov.option_id IN (" . implode(",", array_map('intval', $glami_size_options)) . ")";

// 拼接最终SQL,order_id、order_product_id做整型强转,杜绝注入风险
$qry = "SELECT oo.`value` FROM " . DB_PREFIX . "order_option AS oo
INNER JOIN " . DB_PREFIX . "product_option_value AS pov
ON (oo.product_option_id = pov.product_option_id AND oo.product_option_value_id = pov.product_option_value_id)
WHERE oo.order_id = '" . (int)$order_id . "'
AND oo.order_product_id = '" . (int)$order_product_id . "'"
. $in_clause;
修复说明
  • 强制校验配置项类型,兼容PHP7+对implode()参数必须为数组的要求,避免抛出类型异常
  • 空配置时用1=0恒假条件兜底,既不会触发SQL语法错误,也符合“无有效配置尺寸时不返回匹配数据”的业务逻辑
  • 对所有传入SQL的参数做类型转义:ID类参数强转整型,IN子句内的ID值统一转整型,从根源避免SQL注入风险

内容的提问来源于stack exchange,提问作者k4mk4m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:36:25