PHP查询MySQL数据库报错:where子句存在未知列'RM'
解决MySQL查询报错:Unknown column 'RM' in 'where clause'
嘿,这个报错我太熟悉了!核心原因其实很简单:你把字符串类型的字段值直接拼进SQL语句里,却没给它加单引号。举个例子,当你的$name变量值是RM时,拼接后的SQL会变成这样:
SELECT CITY, ADRESS, CAP FROM PEOPLE WHERE ID_PERSON = $idperson AND NAME_PERSON = RM AND ...
MySQL看到RM没有被引号包裹,就会误以为它是一个列名,可你的PEOPLE表根本没有叫RM的列,这不就报错了嘛!
最安全靠谱的解决方法:用预处理语句
直接把变量硬拼进SQL里,不仅容易踩这种语法坑,还会招来致命的SQL注入风险。所以强烈推荐用预处理语句,下面给你两种常用的实现方式,选你顺手的来:
1. PDO写法(简洁通用,跨数据库友好)
// 先确保你已经建立了PDO连接 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4', '数据库用户名', '密码'); // 用占位符替代变量写SQL $sql_find = "SELECT CITY, ADRESS, CAP FROM PEOPLE WHERE ID_PERSON = :idperson AND NAME_PERSON = :name"; $stmt = $pdo->prepare($sql_find); // 绑定参数并执行查询 $stmt->execute([ ':idperson' => $idperson, ':name' => $name ]); // 获取查询结果 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
2. mysqli面向对象写法
// 假设已经建立好mysqli连接 $conn = new mysqli('localhost', '用户名', '密码', '你的数据库名'); // 准备带占位符的SQL $sql_find = "SELECT CITY, ADRESS, CAP FROM PEOPLE WHERE ID_PERSON = ? AND NAME_PERSON = ?"; $stmt = $conn->prepare($sql_find); // 绑定参数:第一个参数是类型标识(i=整数,s=字符串,根据你的字段类型调整) $stmt->bind_param("is", $idperson, $name); // 执行并获取结果 $stmt->execute(); $result = $stmt->get_result(); $results = $result->fetch_all(MYSQLI_ASSOC);
临时快速修复(仅限测试,生产环境绝对别用!)
如果你只是临时测试想快速看到结果,非要硬拼字符串,那记得给字符串变量加上单引号,同时要转义特殊字符:
// 先转义变量里的特殊字符,防止注入 $name = $conn->real_escape_string($name); // 给$name套上单引号 $sql_find = "SELECT CITY, ADRESS, CAP FROM PEOPLE WHERE ID_PERSON = $idperson AND NAME_PERSON = '$name' AND ...";
再次提醒:这种方法有严重的SQL注入漏洞,正式项目绝对不能用!
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

