2011-01-26 9 views
0

私は間違ったことをしてきましたが、私はURIセグメントの値をとっていました。だから私は私のアプローチを変え、$ _POSTですべてを手に入れました。私はこれを正しくしているかどうか分からないが、誰かが光を当てることができるだろうか?私のビューには、DBから取り出された表データ項目が含まれています。各項目には、「表示」と「削除」という2つのリンクがあります。コードはうまくいくように見えますが、コード化できるかどうかは不思議でした。私はフォーム名が一意ではないことを忘れていたので、レコードを削除しようとすると、常に最新のレコードが削除されます(最後の隠しフィールドが設定されました)。

myview.php URI IDを経由して削除すると、完全に罰金です(スニペット)

<?php foreach($records as $record): ?> 
    <form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete"> 
    <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a> 
    <br /> 
    <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
    </form> 
<?php endforeach ?> 
+0

'私はそれをすべて間違っています。あなたのアプリケーションが制御されている場合、URIセグメントを介して削除することは完全に実行可能な解決策です。あなたのコードでは '$ records as $ record'を使用していますが、' $ location'と呼ばれています.-右にはありません。 – Ross

+0

と私は、将来の問題を避けるために 'base_url()'メソッドを使って絶対URLを使用しますサブフォルダなど..) – ifaour

+0

なぜあなたのアプリケーションを少しajaxifyし、レコードを削除する非同期ポストリクエストを作るのですか?そうすれば、複数のフォームをまったく使用する必要はありません。 – Myth

答えて

1

私はこの問題をどのように解決したのですか。

私のコントローラでは、フォームフィールドが$_POSTを介して送信されたかどうかを確認するdeleteというメソッドがあります。変数がない場合は、エラーメッセージを使ってどこかにリダイレクトしてください。フィールドが渡された場合は、通常のチェックを行ってレコードを削除できることを確認します。

if(!isset($_POST['item_id'])) 
{ 
    $this->session->set_flashdata('message', 'item cannot be removed!'); 
    redirect("/item"); 
} 


if($this->input->post('item_id')) {   
    ... code .... 
    ... code .... 
} 
1

の表示/、私は$_POSTを使用することは間違っていると言うことは、ベンチャーが、すべてのための新しいユニークなフォームを作成していないだろうdelete要素はひどく乱雑で、あなたが得ているものと比べて重視されています(露出IDはありませんか?)、私は削除関数にuriを使用する方が正しいと考えています。

特定のレコードのみを削除できるようにするには、削除機能自体でプログラムで処理しますが、その要求は$_POSTによってのみ送信されるということには依存しません。これは信頼できるものではなく、誰でも投稿リクエストを生成することができます。

+0

そうです、私は、彼らが削除しようとしているレコードがそれらに属します。私はクロスサイト攻撃に関する参考文献を見ました。最大の問題は、レコードIDを含むURLを渡す人物(誰かがそれを知っていれば)であり、故意にそれをクリックしてバイバイレコードをブームすることはありません。 – luckytaxi

+0

あなたが防止しようとしている状況だから、レコードIDとそれが所属するユーザーを見つけて、別のサイトにリンクを作成して、それが所属する特定のユーザーを騙してリンクをクリックすることです。おそらく、ユーザーをガンポイントに誘導し、ユーザーを入れて自分自身を削除する方が簡単だと思います。 ;) – jondavidjohn

0

あなたの構文エラーは、この行を次のとおりです。

<?php foreach($records as $record): ?> 
     <form method="POST" name="myform<?php echo $location->id;?>"  action="/location/delete"> 
     <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo 
$location->id;?>.submit();">Delete</a> 
     <br /> 
      <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
     </form> 
     <?php endforeach ?> 

あなたは、フォームのためにループすることができません。代わりに、次のコードを使用してください:

<form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete"> 
<?php foreach($records as $record): ?> 
    a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a> 
     <br /> 
     <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
    <?php endforeach ?> 
     </form> 
関連する問題