【问题标题】:codeigniter: using uri segment in modelcodeigniter:在模型中使用 uri 段
【发布时间】:2012-09-12 13:22:01
【问题描述】:

我正在使用 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 段在控制器中与模型中一样可用,但有一些我不知道。

【问题讨论】:

  • 这应该可以正常工作,我在您的代码中看不到任何错误
  • 遗憾的是它没有 :( 就像我说的,如果我将这个 "$note_id = $this->uri->segment(3)" 更改为 "$note_id = 24" (我在我的控制器中使用我数据库中存在的 id。所以获取段有问题
  • 查看我的答案和答案中的编辑

标签: codeigniter uri segment


【解决方案1】:

更好的是,您可以将函数更改为:

function delete_note($note_id)

function edit_note($note_id)

并删除$note_id = $this-&gt;uri-&gt;segment(3); 行。

虽然听起来很傻,但生成的 URL 肯定是正确的,对吧?

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

编辑

我还注意到,在编辑时,您在表单中使用了这个:

echo form_open('site/edit_note');

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

【讨论】:

  • 我在 edit_note 视图中使用这个回显来检查我是否得到了我需要的号码:$note_id = $this-&gt;uri-&gt;segment(3); echo "$note_id"; 它打印出我需要的号码
  • 这是在您打开编辑表单时(单击编辑链接后)还是在提交表单并尝试保存后?
  • 是的,这么愚蠢的错误,我在edit_note视图中将其更改为echo form_open('site/edit_note/' .$this-&gt;uri-&gt;segment(3));。它有效!
  • 另一种解决方案是将其留空(所以echo form_open();)。然后浏览器将始终将表单提交到当前 URL 的任何位置(因此您不必每次都手动重建它):)
  • 所以只要像我现在在删除方法中所做的那样做就足够了。不需要做从控制器到模型的所有段,我可以直接从我的模型中访问它
【解决方案2】:

在我看来,在模型中使用 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() 模型函数。

【讨论】:

  • 但我认为模型是用于数据库操作的。不建议使用控制器进行数据操作。
  • 是的,这是正确的,但是您在上面的代码中将您的模型与 URI 绑定 - 根据您当前的逻辑,无法控制谁可以删除这些数据等。我可以转到 yourwebsite.com/delete_note/1 .. /delete_note/2, /3/, /4 并弄乱你所有的数据.. 但是如果你通过控制器传递这些 ID,你可以清理这个值,检查用户是否有根据需要删除注释和更多内容的权限。希望这是有道理的。
  • 是的,现在说得通了。以后一定会用到,谢谢!
【解决方案3】:

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

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);
    }
}

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

【讨论】:

  • 我加载视图,该用户可以有一个表单,在那里他编辑消息。我也需要在该文本区域中显示旧消息,但还没有这样做
  • print_r($this->input->post()) 查看发布数据是否仅用于调试目的
  • 我之前写过:“如果我将这个“$note_id = $this->uri->segment(3)”更改为“$note_id = 24”(我使用存在于我的数据库)在我的控制器中”,所以我猜它会获取发布数据:)
  • 然后执行 echo $this->uri->segment(3);因为第 3 段可能没有任何值,还请检查您的视图文件锚点是否更新,它应该是 'site/members_area/some_id' 而不是 'site/members_area/'
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多