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

数组中存在对象却无法获取属性,报'Trying to get property of non-object'错误求助

问题分析与解决办法

首先咱们来揪出问题根源:你遇到的Trying to get property of non-object警告,核心原因是你把返回的数组当成单个对象来访问属性了。

从你var_dump的输出能明确看到,SoftwareAccess::locateAccess()返回的是一个包含单个权限对象的数组,但你在页面调用时直接尝试用对象属性的方式访问:

$allowed = $access->software_access;

数组本身没有software_access这个属性,自然就触发了警告。

两种解决思路,按需选择:

思路1:在页面调用时从数组中提取目标对象

修改页面代码,先从返回的数组里拿到第一个元素(也就是你需要的权限对象),再访问属性,同时记得处理无权限的情况:

$access = SoftwareAccess::locateAccess($companyId,$accessName);
// 先判断数组不为空,避免无权限时报错
if (!empty($access)) {
    $allowed = $access[0]->software_access;
} else {
    // 无权限时的处理逻辑,比如设为0或提示用户
    $allowed = 0;
}

思路2:修改locateAccess方法,直接返回单个对象

既然这个方法的逻辑是查询某公司对某软件的唯一权限,完全可以在SQL里加上LIMIT 1,然后调整返回逻辑,直接返回单个对象(如果存在的话):

public static function locateAccess($company, $software) 
{
    $sql = "SELECT * FROM software_access WHERE software_company_id = '$company'";
    $sql .= " AND software_software_id = '$software' LIMIT 1";
    $results = self::findQuery($sql);
    // 数组不为空就返回第一个对象,否则返回null
    return !empty($results) ? $results[0] : null;
}

之后页面调用可以保持原有写法,但最好加上空判断,避免无权限时$access为null的情况:

$access = SoftwareAccess::locateAccess($companyId,$accessName);
$allowed = $access ? $access->software_access : 0;

额外重要提醒:SQL注入风险

你的代码里直接把$company和$software拼进SQL语句,存在严重的SQL注入安全隐患!建议改用预处理语句或者参数绑定的方式,比如:

// 示例(具体写法取决于你的数据库操作类)
$sql = "SELECT * FROM software_access WHERE software_company_id = ? AND software_software_id = ? LIMIT 1";
$results = self::findPreparedQuery($sql, [$company, $software]);

这能有效防止恶意用户构造参数攻击你的数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:38