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
相关产品推荐
相关产品推荐

