使用LNSD_123122_LMV格式患者编号查询时出现SQL错误,求修复
问题分析与解决
问题根源
你的SQL查询存在两个核心问题:
- 字符串未加引号:
family_number是字符串类型字段,但你直接将变量$familynumber拼入SQL语句,未包裹单引号。当变量为纯数字时,MySQL会自动将其识别为数值匹配,因此能正常执行;但遇到LNSD_123122_LMV这类带字母/下划线的字符串时,MySQL会误将其当作列名,触发“Unknown column”错误。 - 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
相关产品推荐
相关产品推荐

