存储含转义双引号的JSON时,SQL查询出现语法错误求助
正确查询存储JSON字符串的TEXT字段的方法
问题分析
你当前的代码存在两个核心问题:
- PHP字符串语法错误:
$name = "hello (world" / 000")"里的双引号未正确闭合,导致PHP解析失败。 - 直接拼接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
相关产品推荐
相关产品推荐

