0

私は Codeigniter 2 を学んでおり、基本的なニュース アプリケーションの作成方法に関するチュートリアル/サンプルをうまく試しています。

これが機能するようになった後、ニュース項目に「レコードの削除」リンクを追加して、自分でこれを理解できるかどうかを確認したいと思いました.

これをモデルファイルに追加しましたnews_model.php:

public function delete_news($id) {
    $this->db->delete('news', array('id' => $id));
}

これをコントローラーファイルに追加しましたnews.php

public function delete($id) {
    $this->news_model->delete_news($id);

    $data['news'] = $this->news_model->get_news();
    $data['title'] = 'News item deleted';

    $this->load->view('templates/header', $data);
    $this->load->view('news/index', $data);
    $this->load->view('templates/footer');
}

これをビューファイルに追加しましたindex.php:

<a href="/news/delete/<?php echo $news_item['id'] ?>">Delete Item</a>

最後に、これを構成ファイルに追加しました。routes.php

$route['news/delete/(:any)'] = 'news/delete/$1';

書かれているとおりに動作しているようです。

のニュース一覧ページから、/news/ニュース項目のリンクをクリックすると、ページがリロードされると、対応する項目が消えてしまいます。

質問:

1) ページのリロード後、URL が表示されます/news/delete/id/idは項目番号です。/news/しかし、この新しい URL は必要ありません。ページをリロードして新しいコンテンツを表示したいだけです。ユーザーがページを更新するだけで別のアイテムが削除されるため、明らかに、私がこれを行った方法は潜在的に危険です。これを修正/処理する標準的な方法は何ですか?

2) 私の Controllerdelete()関数では、最初の行の後、基本的に Controller 関数から同じ 5 行のコードを繰り返していindex()ます。これは間違いなく質問 1 に関連していますが、もう一度言いますが、これを行うためのより良い方法は何ですか?

3)「標準」または「ベストプラクティス」に関連して見逃したことはありますか?

4

4 に答える 4

1

次のステップは、エラーと不良データの説明です

  • $id をチェックして、実際に整数であることを確認してください。これは、コントローラーで delete を呼び出す前に、または delete メソッドの一部として発生する可能性があります。重要な点は、ID は検証なしで URL から直接取得されるため、ID をデータベースに近づける前に確認する必要があるということです。
  • モデルでは、delete_news は true または false を返して、レコードが見つかって削除されたことを確認する必要があります。
  • コントローラーで、 $this->news_model->delete_news($id); をラップします。モデルから true が返されたかどうかをチェックする IF で、そうでない場合はエラー リダイレクト。
  • エラーが発生した場合、URL を変更したいのでリダイレクトできます。次のような適切なエラー コードを渡すだけです。

リダイレクト('/news/adminerror/delete');

次に、ニュース コントローラーで adminerror($errortype) のようなメソッドを
作成し、$errortype の値 (この場合は削除エラー) に基づいて、適切なメッセージとビューを表示します。

編集

2-モデルの削除メソッド内で、これを最後に置くだけです:

if ($this->db->affected_rows() == '1')
{return TRUE;}
else
{return FALSE;}

3-コントローラーで、IFをラップします。通常、最初に何かが機能しなかったかどうかを確認する方が簡単です

if( $this->news_model->delete_news($id) == false )
{ 
// redirect to error page or whatever you need       
} 
// if its not false, then its true, which means it worked
else
{ 
$this->session->set_flashdata('error_message', 'record #'. $id . ' deleted');
redirect('/news/');   
} 

レコードを更新するための最後の簡単なヒント --

$this->db->affected_rows() == '1'

また、更新が行われたことを確認するためにも使用されます。しかし、更新を行う場合、ブログ投稿を更新しているとしましょう。その後、クリックして再度更新しますが、実際にはコンテンツを変更していません....これはfalseとして返されます。更新は行われましたが、内容は同じだったので、データベースは変更も「影響」も受けませんでした。

その方法を使用して更新を確認する場合-これを行うためのよりクールな方法があるかもしれませんが、常に異なる更新コンテンツと一緒に何かを送信するだけです-日付/時刻、乱数など.

于 2012-11-15T22:30:38.240 に答える
1

さて、私は再びすべてのものを含めるのではなく、代わりに次のように書きます:

public function delete($id) {
    $this->news_model->delete_news($id);
    redirect(base_url().'news/')
}

そのため、リンクをクリックしてニュースを削除すると、ユーザーは通常のニュース ページにリダイレクトされます。

参照: CodeIgniter URL ヘルパー

よろしくお願いします

ステファン S.

于 2012-11-15T20:49:41.937 に答える
1

1) URL ヘルパーをロードしてからリダイレクトすることをお勧めします/news/。削除の確認を表示したい場合はflash_messagesessionライブラリから使用することをお勧めします。これは、表示するまでセッションでアラートをストックすることを許可します。これは特にその目的のためです。

2) ビューを管理するための自家製のヘルパーを作成することで、ビューを出力するためのパラメーターを指定して関数を呼び出すだけで済みます。しかし、それを最適化したり、コード行を節約したりする他の方法はありません。

3) よくやった、きれいだ。:)

編集:

エラーや成功のメッセージを表示する必要がある場合は、CodeIgniter のセッション ライブラリのflash_message を参照してください。ここでは例を示します。

インデックスにリダイレクトする直前に、コントローラにエラー メッセージを設定します。

$this->load->library('session');
$this->session->set_flashdata('error_message', "This is my error message");

インデックス ビューでは、存在する場合はそれを表示します。

<?if($this->session->flashdata('error_message')):?>
    <div class="nNote nFailure"><p><?=$this->session->flashdata('error_message');?></p></div>
<?endif;?>

flash_message は 1 回表示されることに注意してください。つまり、インデックスにエラーが表示され、セッション メッセージが破棄されます。これが flash_message の目的であり、エラー メッセージを正しく簡単に表示します。

于 2012-11-15T20:50:20.753 に答える
0

正しい方向に向けてくれた Jean-François GB と Stephan S. に感謝します。

これは実用的なソリューションです...

コントローラファイルnews.php:

public function delete($id) {
    $this->news_model->delete_news($id);
    $this->load->helper('url');
    redirect('/news/');
}

編集:

「レコード #x を削除しました」という確認メッセージを表示するように修正しました...

public function delete($id) {
    $this->news_model->delete_news($id);
    $this->load->helper('url');
    $this->load->library('session');
    $this->session->set_flashdata('error_message', 'record #'. $id . ' deleted');
    redirect('/news/');
}

ビューファイル内index.php

<div id="message">
    <?php 
        if ( $this->session->flashdata('error_message') ) {                 
            echo $this->session->flashdata('error_message');
        }
    ?>
</div>
于 2012-11-15T21:01:56.127 に答える