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

存储含转义双引号的JSON时,SQL查询出现语法错误求助

正确查询存储JSON字符串的TEXT字段的方法

问题分析

你当前的代码存在两个核心问题:

  1. PHP字符串语法错误:$name = "hello (world" / 000")" 里的双引号未正确闭合,导致PHP解析失败。
  2. 直接拼接SQL语句:未正确转义特殊字符,破坏了SQL语法结构,同时存在SQL注入风险。

数据库中存储的JSON片段是 "p_name":"hello (world\" / 000\")",对应p_name的实际值是 hello (world" / 000")(JSON里用反斜杠转义了双引号)。

解决方案

方案1:使用预处理语句(推荐,安全且避免转义错误)

不管用原生PHP扩展(PDO/mysqli)还是框架,预处理语句都会自动处理参数转义,彻底解决语法错误和注入问题。

示例(PDO):

// 正确定义$name,用单引号包裹避免PHP解析双引号
$name = 'hello (world" / 000")';
// 构造LIKE匹配模式
$searchPattern = '%"p_name":"' . $name . '"%';
// 预处理SQL
$stmt = $pdo->prepare('SELECT * FROM your_table WHERE textfield LIKE ?');
// 绑定参数并执行
$stmt->execute([$searchPattern]);
$results = $stmt->fetchAll();

框架适配(如果你的getByWhere支持参数绑定):

$name = 'hello (world" / 000")';
$search = '%"p_name":"' . $name . '"%';
// 用参数绑定替代直接拼接
$results = $this->getByWhere('textfield LIKE ?', [$search]);

方案2:手动转义SQL特殊字符(不推荐,仅作参考)

如果必须直接拼接SQL,要用数据库提供的转义函数处理特殊字符:

$name = 'hello (world" / 000")';
$target = '"p_name":"' . $name . '"';
// 假设用mysqli连接,$conn是连接实例
$escapedTarget = mysqli_real_escape_string($conn, $target);
$search = '%' . $escapedTarget . '%';
$sql = "SELECT * FROM your_table WHERE textfield LIKE '$search'";
// 执行查询...

方案3:用数据库JSON函数(更精准,仅支持MySQL 5.7+/PostgreSQL等)

如果数据库支持JSON操作,直接针对JSON字段查询,比LIKE更准确:

SELECT * FROM your_table WHERE JSON_EXTRACT(textfield, '$.p_name') = 'hello (world" / 000")';

对应的PHP预处理代码:

$name = 'hello (world" / 000")';
$stmt = $pdo->prepare('SELECT * FROM your_table WHERE JSON_EXTRACT(textfield, "$.p_name") = ?');
$stmt->execute([$name]);
$results = $stmt->fetchAll();

关键注意事项

  • 定义PHP字符串时,用单引号包裹包含双引号的内容,避免PHP自动解析双引号导致语法错误。
  • 永远避免直接拼接用户输入到SQL语句中,预处理是最安全的方式。
  • 用JSON函数查询比LIKE更可靠,不会误匹配其他相似字符串。

内容的提问来源于stack exchange,提问作者I'm not a robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:53:08