WHERE子句存在未知字段sensorNamePerso,PHP SQL查询报错求助
问题排查与解决方案
嘿,我帮你捋清楚这个问题的根源哈!
1. 为啥会报“未知字段”?
你现在的SQL是直接查historysensor表,但sensorNamePerso这个字段根本不在这个表里——从你提供的表结构来看,它是属于usersensor表的!所以数据库找不到这个字段,这才是报错的核心原因。你之前给字符串加引号只是解决了语法问题,但没解决字段归属的本质问题~
2. 怎么改才对?
要用到这个字段的话,得把两个表关联起来查,因为sensorNamePerso存在于usersensor,而你要查的value和date在historysensor,两个表应该是通过sensorId关联的。同时也要注意字符串值的引号问题,避免语法错误,更推荐用参数化查询防注入。
方案一:用JOIN关联表(最常用)
修改你的PHP代码如下:
// 先把变量提出来,看着更清晰 $sensorId = $sensors_id[1]; $typeId = $type_id[1]; $sensorNamePerso = $sensors_name_perso[1]; // 通过sensorId把两个表关联起来,指定字段属于哪个表 $condi = " JOIN usersensor ON historysensor.sensorId = usersensor.sensorId WHERE historysensor.sensorId = $sensorId AND historysensor.typeId = $typeId AND usersensor.sensorNamePerso = '$sensorNamePerso' AND historysensor.date >= DATE_ADD(NOW(), INTERVAL -1 MONTH) ORDER BY historysensor.date DESC "; // 查询的时候也要明确字段来自historysensor表 $value2 = $database->sqlRequest("SELECT historysensor.value FROM historysensor ".$condi, "value"); $date2 = $database->sqlRequest("SELECT historysensor.date FROM historysensor ".$condi, "date");
方案二:用子查询替代JOIN
如果你不习惯用JOIN,也可以先从usersensor里找出符合sensorNamePerso的sensorId,再用这个ID去查historysensor:
$sensorNamePerso = $sensors_name_perso[1]; $sensorId = $sensors_id[1]; $typeId = $type_id[1]; $condi = " WHERE sensorId = $sensorId AND typeId = $typeId AND sensorId IN (SELECT sensorId FROM usersensor WHERE sensorNamePerso = '$sensorNamePerso') AND date >= DATE_ADD(NOW(), INTERVAL -1 MONTH) ORDER BY date DESC "; $value2 = $database->sqlRequest("SELECT value FROM historysensor ".$condi, "value"); $date2 = $database->sqlRequest("SELECT date FROM historysensor ".$condi, "date");
3. 额外提醒:别踩SQL注入的坑
直接把变量拼进SQL里很容易被注入攻击,要是你的数据库类支持预处理语句,最好改成参数化查询(比如PDO的prepare/execute),举个示例:
// 假设你的$database底层用的是PDO $sql = " SELECT h.value FROM historysensor h JOIN usersensor u ON h.sensorId = u.sensorId WHERE h.sensorId = ? AND h.typeId = ? AND u.sensorNamePerso = ? AND h.date >= DATE_ADD(NOW(), INTERVAL -1 MONTH) ORDER BY h.date DESC "; $stmt = $database->prepare($sql); $stmt->execute([$sensors_id[1], $type_id[1], $sensors_name_perso[1]]); $value2 = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); // 查询date的话同理修改
小技巧:调试更高效
修改完可以先把生成的SQL语句打印出来(比如echo "SELECT value FROM historysensor ".$condi;),然后直接在数据库管理工具里执行,这样能快速看出有没有语法或者逻辑问题~
内容的提问来源于stack exchange,提问作者Jojo
相关产品推荐
相关产品推荐

