codeigniter:在模型中使用uri段

时间:2012-09-20 07:49:41

标签: codeigniter uri segment

我正在使用uri段删除数据库中的信息:

anchor('site/delete_note/'.$row->id, 'Delete')

型号:

function delete_note()
{
    $this->db->where('id', $this->uri->segment(3));
    $this->db->delete('note');
}

它运行正常,但我想要更新我的信息并且无法使其工作 所以这是链接视图:

anchor('site/edit_note/'.$row->id, 'Edit')  

我的控制器:

function edit_note()
{
    $note_id = $this->uri->segment(3);
    $data['main_content'] = 'edit_note';
    $this->load->view('includes/template', $data);

    $this->load->library('form_validation');

    $this->form_validation->set_rules('content', 'Message', 'trim|required');


    if($this->form_validation->run() == TRUE)
    {
        $this->load->model('Note_model');
        $this->Note_model->edit_note($note_id);
        redirect('site/members_area'); 

    }

}

我的模特:

function edit_note($note_id)
{
    $content = $this->input->post('content');
    $data = array('content' => $content);
    $this->db->where('id', $note_id);
    $this->db->update('note', $data);
}

我对edit_note的看法:

<?php

    echo form_open('site/edit_note');
    echo form_textarea('content', set_value('content', 'Your message'));

    echo form_submit('submit', 'Change');
    echo anchor('site/members_area', 'Cancel');


    echo validation_errors('<p class="error">');        ?>
当我试图直接在编辑模型中获取段时,

编辑不能用作删除,就像我在删除模型中使用的那样。

如果我将$ note_id设置为我的控制器中的数字,而不是这个'$ this-&gt; uri-&gt; segment(3)',它会更新我的数据库。但如果我使用获取段它不起作用。我认为uri段在控制器中可用,如模型中所示,但有些东西我不知道。

3 个答案:

答案 0 :(得分:1)

更好的是,您可以将功能更改为:

,而不是通过段手动读取ID

function delete_note($note_id)

function edit_note($note_id)

删除$note_id = $this->uri->segment(3);行。

听起来很傻,生成的网址肯定是正确的,对吧?

最后一个问题,你有没有做过任何路线?

修改

我还注意到在编辑中,您可以在表单中使用它:

echo form_open('site/edit_note');

因此,当表单提交时,它提交的网址为site/edit_note而不是site/edit_note/{SOME_ID}。因此,一旦您进行了更改,并且表单提交,就不会成为第3个网址段!

答案 1 :(得分:0)

在我看来,在模型中使用uri段是一种“坏”方法......你应该从控制器函数传递一个id作为参数。

function delete_note()
{
    $this->db->where('id', $this->uri->segment(3));
    $this->db->delete('note');
}

如果您想重新使用此删除方法,该怎么办?例如从管理面板,通过cron作业等删除注释,然后上面依赖于uri段,您将需要创建其他删除方法来完成这项工作。此外,如果你继续使用相同的,你甚至不需要一个模型然后..如果你知道我的意思,只需在你的控制器中调用这些行......

$this->db->where('id', $this->uri->segment(3));
$this->db->delete('note');

最好将其更改为类似于edit_note()模型函数。

答案 2 :(得分:0)

您的代码中存在一些逻辑错误。

function edit_note()
{
    $note_id = $this->uri->segment(3);
    $data['main_content'] = 'edit_note';
    $this->load->view('includes/template', $data);
//// What is the use of loadig a view when you are editing

    $this->load->library('form_validation');

    $this->form_validation->set_rules('content', 'Message', 'trim|required');


    if($this->form_validation->run() == TRUE)
    {
        $this->load->model('Note_model');
        $this->Note_model->edit_note($note_id);
        redirect('site/members_area'); 

    }

}

而是像这样做

function edit_note()
{
    if($this->input->post()){

        $this->load->library('form_validation');

        $this->form_validation->set_rules('content', 'Message', 'trim|required');


        if($this->form_validation->run() == TRUE)
        {
            $this->load->model('Note_model');
            $this->Note_model->edit_note($note_id);
            redirect('site/members_area'); 
        }
    }else{
        $note_id = $this->uri->segment(3);
        $data['main_content'] = 'edit_note';
        $this->load->view('includes/template', $data);
    }
}

最重要的是 另外你应该注意到你使用锚点来访问编辑注释,但实际上并没有提交表单,所以它没有得到任何更新的帖子数据。