2011-08-24 6 views
4

받은 편지함에서 여러 개의 확인란을 선택하고 제출하려면 제출을 클릭하여 데이터베이스에서 여러 개인 메시지를 삭제하려고합니다. 나는 아래 코드를 가지고 있지만 아무 일도 일어나지 않는다. 나는 내가 부족 모르겠어요 ..Codeigniter는 여러 행을 확인란으로 선택하여 삭제합니다.

보기 :

<?php echo form_open('pm/remove_checked'); ?> 

<?php foreach ($query as $row): ?> 
    <input type="checkbox" name="msg[]" value="<?php echo $row->id; ?>" /> 
    <?php echo $row->from; ?> 
    <?php echo $row->subject; ?>  
    <?php echo date("m/d/Y",strtotime($row->msg_date)); ?>   
<?php endforeach; ?> 

<?php echo form_submit('delete', 'Delete'); ?> 

</form> 

컨트롤러 :

function remove_checked() 
{ 
     //validation rules 
     $this->form_validation->set_rules('msg[]', 'Private Message', 'required|xss_clean'); 

     if ($this->form_validation->run() == FALSE) 
     { 
      $data['query'] = $this->Pm_model->received_msg(); 
      $this->load->view('pm/inbox', $data); 
     } 
     else //success 
     { 
      $checked_messages = $this->input->post('msg'); //selected messages 
      $this->Pm_model->delete_checked($checked_messages); 

      //redirect to inbox          
     } 

} 

모델 :

function delete_checked($checked_messages) 
{ 
    $checked_messages = array(); 
    foreach ($checked_messages as $msg_id): 

      $this->db->select('id'); 
      $this->db->from('user_msg'); 
      $this->db->where('id', $msg_id); 
      $this->db->limit(1); 
      $query = $this->db->get(); 

      if ($query->num_rows() > 0) //if message exists 
      {    
      $this->db->where('id', $msg_id); 
      $this->db->where('recipient', $this->users->get_user_id()); //verify if recipient id is equal to logged in user id 
      $this->db->delete('user_msg'); 

      } 
      else 
      { 
       return FALSE; 
      } 

    endforeach; 
} 

답변

4

, 당신은 return은 첫 번째 메시지는 존재하지 않는 return 루프의 실행을 중지되므로이 삭제되는 메시지의 나머지 부분을 방지 할 것 "발견"되는 즉시 FALSE을 보내고있다 . 이렇게하려면 continue을 대신 사용하고 transactions을 사용하는 것이 좋습니다.

는 특히 각 메시지에 대한 개별 오류를 생성하는 신경 쓰지 않는 경우

은 모델의 기능은 조금 단순화 할 수 있습니다

function delete_checked($message_ids) 
{ 
    $this->db 
     ->where_in('id', $message_ids) 
     ->where('recipient', $this->users->get_user_id()) 
     ->delete('user_msg'); 
    return $this->db->affected_rows() > 0; 
} 

이 단지 레코드를 삭제하려고합니다. 존재하지 않는 경우 무시되고 $this->db->affected_rows()이어야합니다.은 삭제 된 메시지의 수를 반환합니다. 모두 메시지가 삭제되도록하려면이 메시지를 count($message_ids)과 비교하거나 하나 이상의 메시지가 삭제되었는지 확인하는이 예제 방법을 사용하십시오. 메시지가 없으면 어쨌든 삭제할 필요가 없습니다.

All the stuff Chris Schmitz mentioned 또한 정확하고 중요합니다. 몇 가지 매우 기본적인 오류가 있습니다. 대신에 을 배열로 배열하면이 함수에 단일 ID (정수 또는 문자열)를 전달할 것으로 예상되는 경우$checked_messages을 빈 배열에 할당 할 수 있습니다. 이와 같이 :

$message_ids = (array) $message_ids; 
+0

제안 해 주셔서 감사합니다! 나는'계속'과 거래에 대해 몰랐다. 루프의 경우'($ check_messages as $ key => $ msg_id)'..를 사용해야했습니다. 배열 항목의 값을 얻지 못했습니다. – CyberJunkie

1

당신은 입력에 $checked_msg를 할당하는 확인했지만 다른 변수 $checked_messages을 모델에 전달하고 있습니다. $checked_msg var을 모델에 전달해야합니다.

또한 모델에서 $checked_messages var을 다시 선언하고 빈 배열로 설정합니다. 당신은 그것을 제거 할 필요가있을 것이다. 그렇지 않으면 메소드에 전달할 정보를 덮어 쓴다. 현재 delete_checked() 방법에서

+0

죄송합니다. 코드를 읽을 수 없게 만들었습니다. 내 원본에서 그들은 동일합니다. – CyberJunkie

관련 문제