PHP面向对象查询数据库报Trying to get property of non-object错误求助
解决OO-PHP中检索数据时的"Trying to get property of non-object"错误
我帮你排查了代码里的问题,这个错误主要来自两个关键的逻辑疏漏,咱们一步步来修正:
1. find_this_query方法的返回值错误
你在这个方法里已经把数据库查询结果循环转换成了User对象数组$the_object_array,但最后却返回了原始的数据库结果集$result_set,而不是这个对象数组。这就导致find_all_users返回的是结果集而非对象数组,foreach遍历的时候自然无法拿到User对象,也就会触发“获取非对象属性”的错误。
修复后的find_this_query方法:
public static function find_this_query($sql){ global $database; $result_set = $database->query($sql); $the_object_array = array(); while($row = mysqli_fetch_array($result_set)){ $the_object_array[] = self::instantation($row); } // 改为返回对象数组,而不是结果集 return $the_object_array; }
2. find_user_by_id方法的逻辑错误
原来的方法调用find_this_query得到结果集后,用mysqli_fetch_array去取数组,但修复后的find_this_query会返回对象数组,所以这里应该直接取数组的第一个元素(因为SQL里加了LIMIT 1),同时要处理查询不到用户的情况,避免返回null导致后续出错。
修复后的find_user_by_id方法:
public static function find_user_by_id($user_id){ global $database; $user_array = self::find_this_query("SELECT * FROM users WHERE id=$user_id LIMIT 1"); // 如果查询到结果,返回第一个对象;否则返回null return !empty($user_array) ? array_shift($user_array) : null; }
额外建议:SQL注入防护
你的代码里直接把$user_id拼到SQL语句里,存在严重的SQL注入风险,建议改用预处理语句,比如修改find_user_by_id为更安全的实现:
// 更安全的find_user_by_id实现(用预处理) public static function find_user_by_id($user_id){ global $database; $sql = "SELECT * FROM users WHERE id=? LIMIT 1"; $stmt = $database->connection->prepare($sql); $stmt->bind_param("i", $user_id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $stmt->close(); return $row ? self::instantation($row) : null; }
验证修复后的代码
修改完成后,index.php里的遍历逻辑就能正常工作了:
$users = User::find_all_users(); foreach($users as $user){ echo $user->username; }
内容的提问来源于stack exchange,提问作者Sanam Rohit
相关产品推荐
相关产品推荐

