CodeIgniter3跨用户查看表单详情报Trying to get property of non-object错误
CodeIgniter3 跨用户查看表单详情触发「Trying to get property of non-object」错误
我是首次使用Stack Overflow,还请各位帮忙解决问题(抱歉英文不佳)。我的项目基于CodeIgniter3,问题场景如下:管理员(用户1)创建表单后可正常查看详情菜单,但员工(用户2)查看该管理员创建的表单详情时,会触发「Trying to get property of non-object」错误,反之亦然。报错涉及的属性为:id_barang_masuk、id_user、nama、waktu。
视图文件代码(路径:views/pages/inputs/detail.php)
<div class="container-fluid"> <?php $this->load->view('layouts/_alert') ?> <div class="row" id="printBukti"> <div class="col-md-12"> <div class="card mb-3"> <div class="card-header bg-primary text-white"> Detail Pemasukan Barang </div> <div class="card-body"> <table class="table-responsive mb-3 no-wrap"> <tr> <td>Nomor pemasukan</td> <td>:</td> <td><?= $barang_masuk->id_barang_masuk ?></td> <!-- id_barang_masuk 报错 --> </tr> <tr> <td>NIP Staff</td> <td>:</td> <td><?= $barang_masuk->id_user ?></td> <!-- id_user 报错 --> </tr> <tr> <td>Nama Staff</td> <td>:</td> <td><?= $barang_masuk->nama ?></td> <!-- nama 报错 --> </tr> <tr> <td>Waktu</td> <td>:</td> <td><?= date('d/m/Y H:i:s', strtotime($barang_masuk->waktu)) ?></td> <!-- waktu 报错 --> </tr> </table>
控制器文件代码(路径:controller/inputs.php)
class Inputs extends MY_Controller { private $id_user; public function __construct() { parent::__construct(); $this->id_user = $this->session->userdata('id_user'); $is_login = $this->session->userdata('is_login'); if (!$is_login) { $this->session->set_flashdata('warning', 'Anda belum login'); redirect(base_url('login')); return; } } public function index($page = null) { $this->session->unset_userdata('keyword'); $this->session->unset_userdata('time'); $data['title'] = 'Inventory MS - List Barang Masuk'; $data['breadcrumb_title'] = 'List Barang Masuk'; $data['breadcrumb_path'] = 'Barang Masuk / List Barang Masuk'; $data['content'] = $this->inputs->select([ 'barang_masuk.id', 'user.nama', 'barang_masuk.waktu', 'barang_masuk.total_harga' ]) ->join('user') ->orderBy('barang_masuk.waktu', 'DESC') ->paginate($page) ->get(); $data['total_rows'] = $this->inputs->count(); $data['pagination'] = $this->inputs->makePagination(base_url('inputs'), 2, $data['total_rows']); $data['page'] = 'pages/inputs/index'; $this->view($data); }
已尝试的无效解决方案
<?php if ($barang_masuk) { ?> <table class="table-responsive mb-3 no-wrap"> <tr> <td>Nomor pemasukan</td> <td>:</td> <td><?= $barang_masuk->id_barang_masuk ?></td> </tr> <tr> <td>NIP Staff</td> <td>:</td> <td><?= $barang_masuk->id_user ?></td> </tr> <tr> <td>Nama Staff</td> <td>:</td> <td><?= $barang_masuk->nama ?></td> </tr> <tr> <td>Waktu</td> <td>:</td> <td><?= date('d/m/Y H:i:s', strtotime($barang_masuk->waktu)) ?></td> </tr> </table> <?php } else { ?> <p>Data pemasukan barang tidak tersedia.</p> <?php } ?>
补充信息
管理员查看自己创建的详情菜单正常,员工查看他人创建的表单详情则报错。
问题原因及解决方法
核心原因:
- 控制器缺失详情页的
detail方法,无法正确传递数据到视图; - 模型查询逻辑大概率默认限制了仅查询当前登录用户的数据,导致跨用户访问时
$barang_masuk为空,触发非对象属性访问错误。
- 控制器缺失详情页的
解决步骤:
- 补全控制器详情方法:在
Inputs控制器中添加详情查询逻辑,根据业务需求决定是否允许跨用户查看(管理员可查看所有,员工仅查看自己):public function detail($id) { // 构建查询,关联用户表获取所需字段 $query = $this->inputs->select([ 'barang_masuk.id AS id_barang_masuk', 'barang_masuk.id_user', 'user.nama', 'barang_masuk.waktu' ]) ->join('user', 'barang_masuk.id_user = user.id') ->where('barang_masuk.id', $id); // 若员工仅能查看自己的数据,添加以下判断;管理员则跳过 if ($this->session->userdata('role') !== 'admin') { $query->where('barang_masuk.id_user', $this->id_user); } $data['barang_masuk'] = $query->first(); // 无数据时跳转并提示 if (!$data['barang_masuk']) { $this->session->set_flashdata('error', '数据不存在或无访问权限'); redirect(base_url('inputs')); return; } $data['title'] = 'Detail Pemasukan Barang'; $data['page'] = 'pages/inputs/detail'; $this->view($data); } - 检查模型默认限制:查看
inputs模型的全局作用域或默认查询条件,若存在强制匹配当前用户的where语句,需在详情查询时临时解除(或通过权限判断动态调整); - 优化视图判断逻辑:替换原有判断为更严谨的对象类型检查:
<?php if (is_object($barang_masuk)) { ?> <!-- 原有表格渲染代码 --> <?php } else { ?> <p>数据不存在或无访问权限</p> <?php } ?>
- 补全控制器详情方法:在
内容的提问来源于stack exchange,提问作者Gujiro Namoa
相关产品推荐
相关产品推荐

