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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:21:42