0

我正在使用 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->uri->segment(3)',它会更新我的数据库。但是,如果我使用获取细分它不起作用。我认为 uri 段在控制器中与模型中一样可用,但有一些我不知道。

4

3 回答 3

1

更好的是,您可以将函数更改为:而不是通过段手动读取 ID:

function delete_note($note_id)

function edit_note($note_id)

并删除$note_id = $this->uri->segment(3);线条。

尽管听起来很傻,但生成的 URL 绝对是正确的,对吧?

最后一个问题,你对路线做过什么吗?

编辑

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

echo form_open('site/edit_note');

所以当表单提交时,它提交的 URL 是site/edit_note而不是site/edit_note/{SOME_ID}. 因此,一旦您进行了更改并提交了表单,就不会有第三个 URL 段!

于 2012-09-20T08:19:46.297 回答
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() 模型函数。

于 2012-09-20T08:01:15.537 回答
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);
    }
}

最重要
的另一件事是,您应该注意的是,您正在使用锚点来访问编辑注释,但实际上并未提交表单,因此它不会获取任何要更新的发布数据。

于 2012-09-20T08:03:10.537 回答