在视图文件中调用 row() 方法时发生致命错误:“调用非对象上的成员函数 row()”

问题描述 投票:0回答:5

我试图将查询结果获取到视图,但它总是以错误结束:

致命错误:在

中的非对象上调用成员函数 row()

我正在尝试通过客户 ID 搜索客户信息并尝试将结果显示到视图中。

这是我的观点:

<?php echo form_open('home/cari_id');
?>
<table width='34%' align='left'>
    <tr>
        <td width="54%" align="left">ID Pelanggan</td>
        
        <td width="36%">
            <?php echo form_input('id',set_value('id'));?>
            <?php echo form_error('id');?>
        </td>
        <td width="10%">
            <?php echo form_submit('submit','Cari');?>
        </td>
    </tr>
</table> 

<br /><br />

<table width="68%" align="left">
    <tr>
        <td width="17%" align="left">Nama</td>
        <td>
            <?php   
                $row = $record->row();
                $nama1 = array(
                         'name' => 'nama',
                         'maxlength' => '100',
                         'size' => '50',
                         'style' => 'width:120%');
                echo form_input($nama1,$row->nama);?>
            <?php echo form_error('nama');?>
        </td>
    </tr>
    <tr>
    <td align="left">Alamat</td>
    <td>
        <?php 
            $alamat1 = array(
                        'name' => 'alamat',
                        'rows' => '5',
                        'cols' => '3',
                        'style' => 'width:200%');
            echo form_textarea($alamat1,$row->alamat);?>
        <?php echo form_error('alamat');?>
    </td>
    </tr>
    <tr>
        <td align="left">Golongan</td>
        <td width='29%'>
            <?php 
                $gol1 = array(
                        'name' => 'gol',
                        'maxlength' => '100',
                        'size' => '50',
                        'style' => 'width:40%');
                echo form_input($gol1,$row->golongan);?>
            <?php echo form_error('gol');?>
        </td>
        <td width="10%" align="left">Tarif</td>
        <td width="44%">
            <?php 
                $tarif = array(
                'name' => 'tarif',
                'maxlength' => '100',
                'size' => '50',
                'style' => 'width:30%');
                echo form_input($tarif,$row->tarif);?>
            <?php echo form_error('tarif');?>
        </td>
    </tr>
</table>

这是我的控制器方法:

public function cari_id()
{
    $this->auth->restrict();
    // mencegah user mengakses menu yang tidak boleh ia buka
    $this->auth->cek_menu(4);
    
    $this->load->library('form_validation');
    
    $this->form_validation->set_rules('id', 'ID Pelanggan', 'trim|required');
    //$this->form_validation->set_rules('nama','Nama','trim'|'required');
    //$this->form_validation->set_rules('alamat','Alamat','trim'|'required');
    //$this->form_validation->set_rules('gol', 'Golongan', 'trim|required');
    //$this->form_validation->set_rules('tarif', 'Tarif', 'trim|required');
    $this->form_validation->set_error_delimiters(' <span style="color:#FF0000">', '</span>');
    $id_pel = $this->input->post('id') ;
    //$data1 = $this->usermodel->get_list_bayar_pel($id_pel);
    //$data=$data1->row();
    $data1 = $this->usermodel->get_list_bayar_pel($id_pel);
    $data['record'] = $query->result_array();
    $this->template->set('title','Input Pembayaran | POS Application');
    $this->template->load('template','admin/input_pembayaran',$data);
}

我的模型方法:

function get_list_bayar_pel($id)
{
    $this->db->select('b.name as nama, b.address as alamat, c.nm_gol as golongan,d.rate_value as tarif');
    $this->db->from('account_t a, account_nameinfo_t b, golongan_t c, (select rate_value from rate_t a, golongan_t b where a.id_gol = b.id_gol) d');    
    $this->db->where('a.id_account = b.obj_id');
    $this->db->where('a.id_gol = c.id_gol');
    $this->db->where('a.id_account = "'.$id.'"');
    $result = $this->db->get();
    return $result;
}
php codeigniter model-view-controller
5个回答
0
投票

将这个写入你的控制器

$data['record'] = $query->row();

并在视图中删除 php代码编写

 <?php   

                $nama1 = array(
                         'name' => 'nama',
                         'maxlength' => '100',
                         'size' => '50',
                         'style' => 'width:120%');
                echo form_input($nama1,$record->nama);?>
            <?php echo form_error('nama');?>

在模型中

$result = $this->db->get('tablename')->row();

0
投票

$record 不返回单行,它返回一个集合,或者使用 current($record)->row() 或获取单行。


0
投票

在您的控制器中,您正在获取多行

$data['record'] = $query->result_array();

应该是

$data['record'] = $query->row();

并在视图中给出 $row = $record;而不是 $row = $record->row();


0
投票

根据您的代码,您使用 row() 函数来检索视图中的数据,同时它已使用以下方法在控制器中获取:

 $data['record'] = $query->result_array();


只需使用其中之一(在控制器中):

$data['record'] = $query->result_array();

$data['record'] = $query->row();

然后在视图中处理数组

希望有帮助:)


注意:
- 我建议您使用 result_array() 将数据检索到数组中


0
投票
  • 我不赞成 SQL 中老式的逗号连接——它们使查询对于人类读者来说不太直观。需要 JOIN 表时使用显式关键字。

  • 作为最佳实践,您的查询不应将

    $id
    作为 where 条件的子字符串传递。

  • 将查询的结果对象返回到其他层可能是不可取的。是的,它提供了不同控制器方法的灵活性,以细粒度的方式填充数据结构,但它也会导致“胖控制器”(执行太多操作)并降低整个项目的数据一致性。相反,在模型方法签名中,显式将数据类型

    $id
    设置为整数,将返回值设置为数组(如果需要数组的数组,请使用
    ->result_array()
    )。

  • 在控制器中,您声明

    $data1
    来接收模型的返回值,但随后尝试将数据从
    $query->result_array()
    (请记住,
    $query
    不是此范围内的声明变量)传递到
    $data['record']
    。模型方法的返回值应直接传递给
    $data['record']
    ,无需中间变量声明。

  • 所有到达视图层的数据都应该做好充分准备。视图最多应该执行少量的数据格式化,但仅此而已。唯一的工作应该是呈现数据。

  • 因为根据谷歌的说法,

    bayar_pel
    的意思是“支付拖把费用”,所以我不知道你的模型方法是做什么的。如果返回多行,则返回二维数组;如果它始终返回单行或
    null
    ,则使用
    row()
    row_array()
    (根据您的偏好)。

模型方法:

function get_list_bayar_pel(int $id): array
{
    return $this->db
        ->select([
            'b.name AS nama',
            'b.address AS alamat',
            'c.nm_gol AS golongan',
            'd.rate_value AS tarif',
        ])
        ->join('account_nameinfo_t b', 'a.id_account = b.obj_id')
        ->join('golongan_t c', 'a.id_gol = c.id_gol')
        ->join('rate_t d', 'b.id_gol = d.id_gol')
        ->get_where('account_t a', ['a.id_account' => $id])
        ->result_array();
}

控制器方法:

public function cari_id()
{
    $this->auth->restrict();
    // prevent users from accessing menus that they cannot open
    $this->auth->cek_menu(4);

    $this->load->library('form_validation');
    $this->form_validation->set_rules('id', 'ID Pelanggan', 'trim|required');
    $this->form_validation->set_error_delimiters(' <span style="color:#FF0000">', '</span>');

    $id_pel = $this->input->post('id') ;
    $data['record'] = $this->usermodel->get_list_bayar_pel($id_pel);
    $this->template->set('title', 'Input Pembayaran | POS Application');
    $this->template->load('template', 'admin/input_pembayaran', $data);
}

在你看来,如果你的模型方法返回

result_array()
(一个空数组或数组的数组),那么
$row = $record->row();
应该变成:

if (!$record) {
    exit('Record not found for supplied id');
} else {
    $row = $record[0];
    // ... your form fields ...
}
      

如果您的模型方法返回

row()
(平面对象或 null),则
$row = $record->row();
应变为:

if (!$record) {
    exit('Record not found for supplied id');
} else {
    // don't bother declaring $row, just use the $record object to access its properties
    // ... your form fields ...
}
© www.soinside.com 2019 - 2024. All rights reserved.