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">');        ?>

モデルの削除で使用したように、編集モデルでセグメントを直接取得しようとすると、編集が削除として機能しません。

この'$this-> uri-> segment(3)'の代わりに、コントローラーで$ note_idを数値に設定すると、データベースが更新されます。しかし、getting segmentを使用すると、機能しません。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}ます。したがって、変更を加えてフォームを送信すると、3番目の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 に答える