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

User类中MySQL命令无法执行,报Trying to get property of non-object错误

问题分析与修复方案

直接错误原因

报错Trying to get property of non-object出现在if ($rs->num_rows >0)这一行,说明$rs不是一个有效对象——要么$this->db->query($sql)执行失败返回了false,要么$this->db本身就是非对象(如null)。以下是具体根源和修复步骤:


1. 数据库连接类的构造函数错误

PHP的构造函数__construct()不允许返回值,你在db类构造函数中写的return $this->mysqli;完全无效。实例化db类时,得到的是db对象而非mysqli对象,这会导致后续数据库连接引用出错。

修复db类:

namespace CustomerCare;
class db
{
    public $db_host;
    public $db_username; // 修正拼写错误:原变量名db_usermame
    public $db_password;
    public $db_database;
    public $mysqli; // 显式声明mysqli属性,避免动态属性的不确定性

    public function __construct()
    {
        $this->db_host      = "...";
        $this->db_username  = "...";
        $this->db_password  = "...";
        $this->db_database  = "...";

        $this->mysqli = new \mysqli($this->db_host, $this->db_username, $this->db_password, $this->db_database);

        if ($this->mysqli->connect_errno) {
            die("数据库连接失败: ".$this->mysqli->connect_error);
        }

        $this->mysqli->set_charset('utf8');
        // 移除return语句,构造函数无需返回值
    }

    // 可选:封装获取连接的方法,更符合面向对象原则
    public function getConnection()
    {
        return $this->mysqli;
    }
}

修复User类的构造函数:

// 方式1:直接访问db类的mysqli属性
public function __construct($_db){
    $this->db = $_db->mysqli;
}

// 方式2:使用封装的getConnection方法(推荐)
public function __construct($_db){
    $this->db = $_db->getConnection();
}

2. SQL执行失败与注入风险

直接拼接变量到SQL语句中不仅会引发SQL注入风险,还可能因变量包含特殊字符导致SQL语法错误,使query()返回false,进而触发报错。

修复ComboBoxUsers方法:

public function ComboBoxUsers($ei, $user)
{
    $key = "blablabla";
    // 使用预处理语句彻底避免SQL注入
    $stmt = $this->db->prepare("CALL new_getUsers(?, ?)");
    $stmt->bind_param("ss", $ei, $key);
    $stmt->execute();
    $rs = $stmt->get_result();

    $output = "";
    $selected = "";
    // 先判断结果集是否有效
    if ($rs && $rs->num_rows > 0) {
        while ($record = $rs->fetch_assoc()) {
            $selected = ($record['userEmail'] == $user) ? 'selected' : '';
            // 用htmlspecialchars转义输出,防止XSS攻击
            $output .=  "<option value='".htmlspecialchars($record['userEmail'])."' {$selected}>";
            $output .=      htmlspecialchars($record['userLastname'])." ".htmlspecialchars($record['userFirstname'])." ".htmlspecialchars($record['title']);
            $output .=  "</option>";
        }
    }
    // 关闭结果集与预处理语句
    $rs->close();
    $stmt->close();
    return $output;
}

3. 额外设计问题(非直接报错原因,但需修正)

User类的所有属性都用了static关键字,这会导致所有User实例共享同一组属性值,完全违背用户类的设计逻辑,应移除static:

class User
{
    private $_id;
    private $_firstname;
    private $_lastname;
    private $_email;
    private $_entityId;

    // 对应的getter/setter同步修改为$this引用
    public function getId() { return $this->_id; }
    public function setId($var) { $this->_id = $var; }
    // 其余getter/setter同理修改
}

内容的提问来源于stack exchange,提问作者user3448324

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:15:46