将SQL语句存入PHP变量时遭遇‘Trying to get property of non-object’错误求助
解决SQL语法错误与"Trying to get the property of non-object"问题
嘿,我帮你分析下这个问题,你遇到的错误主要来自两个核心问题,咱们一步步来拆解修复:
1. 先搞定最致命的SQL语法顺序错误
你把WHERE子句放在了INNER JOIN前面,这完全不符合SQL的语法规范。正确的SQL执行顺序是:SELECT → FROM → JOIN ... ON → WHERE,所以你得把WHERE挪到所有JOIN语句的后面。
错误的代码片段:
$sql = "SELECT grades_eng.Grade, domain_math_eng.Domain, cluster_eng.Cluster, math_standards_eng.Standard FROM ".$this->standardsTable." WHERE Standard LIKE '%".$this->keyword." %' INNER JOIN grades_eng ON math_standards_eng..."
修正后的SQL结构(记得补全所有JOIN的关联条件,不然还是会执行失败):
$sql = "SELECT grades_eng.Grade, domain_math_eng.Domain, cluster_eng.Cluster, math_standards_eng.Standard FROM ".$this->standardsTable." INNER JOIN grades_eng ON math_standards_eng.[你的关联字段] = grades_eng.[对应关联字段] -- 这里还要补上domain_math_eng、cluster_eng的JOIN语句和关联条件 WHERE math_standards_eng.Standard LIKE '%".$this->keyword."%'";
另外注意:你原来的LIKE表达式里多了个空格'%".$this->keyword." %',这会导致只能匹配关键词后带空格的内容,建议改成'%".$this->keyword."%'来匹配包含关键词的任意内容。
2. 排查"Trying to get the property of non-object"错误
这个错误本质是:你执行SQL后得到的不是一个可操作的对象(比如SQL执行失败返回了false),但你后续代码里尝试调用它的属性/方法(比如fetch()、fetchAll())。
你可以从这几个点排查:
- 先确认
$this->keyword有没有被正确赋值,会不会是null或者压根没定义?可以在拼接SQL前加一行var_dump($this->keyword);看看实际值。 - 检查
$this->standardsTable对应的表名有没有拼写错误,是不是数据库里真实存在的表? - 执行SQL后一定要做错误检查,比如用PDO的话:
$stmt = $this->db->prepare($sql); $executeResult = $stmt->execute(); if (!$executeResult) { // 打印错误信息,快速定位问题 var_dump($this->db->errorInfo()); return; } // 再去获取结果集 $results = $stmt->fetchAll(PDO::FETCH_OBJ);
3. 必须修复的SQL注入风险
直接把用户输入的$this->keyword拼接到SQL里,是严重的安全漏洞,很容易被黑客利用。强烈建议用预处理语句来处理,示例如下:
public function searchTable() { // 用占位符:keyword代替直接拼接变量 $sql = "SELECT grades_eng.Grade, domain_math_eng.Domain, cluster_eng.Cluster, math_standards_eng.Standard FROM ".$this->standardsTable." INNER JOIN grades_eng ON math_standards_eng.id = grades_eng.standard_id INNER JOIN domain_math_eng ON math_standards_eng.domain_id = domain_math_eng.id INNER JOIN cluster_eng ON math_standards_eng.cluster_id = cluster_eng.id WHERE math_standards_eng.Standard LIKE :keyword"; // 假设你用PDO连接数据库 $stmt = $this->db->prepare($sql); // 给占位符赋值,自动处理转义,彻底避免注入 $keywordParam = "%".$this->keyword."%"; $stmt->bindParam(':keyword', $keywordParam, PDO::PARAM_STR); // 执行并检查结果 if (!$stmt->execute()) { var_dump($stmt->errorInfo()); return []; } return $stmt->fetchAll(PDO::FETCH_OBJ); }
按照上面的步骤调整后,不仅能解决语法错误和非对象报错,还能堵住安全漏洞,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者BMLG Learning
相关产品推荐
相关产品推荐

