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

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 } ?>

补充信息

管理员查看自己创建的详情菜单正常,员工查看他人创建的表单详情则报错。


问题原因及解决方法

  1. 核心原因:

    • 控制器缺失详情页的detail方法,无法正确传递数据到视图;
    • 模型查询逻辑大概率默认限制了仅查询当前登录用户的数据,导致跨用户访问时$barang_masuk为空,触发非对象属性访问错误。
  2. 解决步骤:

    • 补全控制器详情方法:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:56