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

使用LNSD_123122_LMV格式患者编号查询时出现SQL错误,求修复

问题分析与解决

问题根源

你的SQL查询存在两个核心问题:

  1. 字符串未加引号:family_number是字符串类型字段,但你直接将变量$familynumber拼入SQL语句,未包裹单引号。当变量为纯数字时,MySQL会自动将其识别为数值匹配,因此能正常执行;但遇到LNSD_123122_LMV这类带字母/下划线的字符串时,MySQL会误将其当作列名,触发“Unknown column”错误。
  2. SQL注入风险:直接拼接变量到SQL语句中,属于不安全的写法,容易被注入攻击。

举个错误示例:当$familynumber = 'LNSD_123122_LMV'时,生成的SQL是:

SELECT * FROM medical_itr WHERE family_number LIKE LNSD_123122_LMV

数据库会把LNSD_123122_LMV当成列名,自然报错。

正确解决方案(使用预处理语句)

用参数绑定的预处理语句,既能解决引号问题,又能彻底避免SQL注入:

<?php
$familynumber = $row['family_number'];

// 1. 准备带占位符的SQL语句
$sql1 = "SELECT * FROM medical_itr WHERE family_number = ?";
// 若需模糊匹配,改为:$sql1 = "SELECT * FROM medical_itr WHERE family_number LIKE ?";

// 2. 预处理语句
$stmt = $con->prepare($sql1);

// 3. 绑定参数:"s"表示参数为字符串类型
// 模糊匹配的话,先给变量加通配符:$familynumber = "%{$familynumber}%"
$stmt->bind_param("s", $familynumber);

// 4. 执行查询并获取结果
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

// 5. 关闭语句(可选,但推荐)
$stmt->close();
?>

补充说明

  • 如果是精确匹配,用=替代LIKE更高效;
  • 如果是模糊查询,需要在绑定参数前给变量前后加上%,比如$familynumber = "%{$familynumber}%"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:35:34