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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:45