2011-01-26 7 views
0

나는 그것을 잘못하고있다. 나는 URI 세그먼트의 값을 사용했는데 이상적인 방법이 아니란 것을 깨닫지 못했다. 그래서 저는 접근 방식을 바꾸었고 이제 $ _POST를 통해 모든 것을 갖게되었습니다. 내가 제대로하고 있는지 잘 모르겠다. 누군가가 빛을 비춰 줄 수 있을까? 내보기에는 DB에서 가져온 테이블 형식의 데이터 목록 항목이 포함되어 있습니다. 각 항목에는 두 개의 링크 인 "보기"와 "삭제"가 있습니다. 코드가 작동하는 것 같지만 더 잘 코딩 될 수 있는지 궁금해하고있었습니다. 양식 이름이 고유하지 않으므로 레코드 삭제를 시도 할 때 항상 최신 레코드가 삭제됩니다 (마지막 숨겨진 필드가 설정 됨).

myview.php (조각)

<?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을 사용합니다 (프로젝트 이동하기 sub-folder..etc) – 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

보기가/URI ID를 통해 삭제하면 완벽하게 괜찮습니다, 나는 $_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> 
관련 문제