Codeigniter delete multiple rows with checkboxes

16,205

Solution 1

In your current delete_checked() method, you are returning FALSE as soon as the first message is "found" that doesn't exist, this will prevent the rest of the messages from being deleted as return will stop execution of the loop. If you want to do it this way, use continue instead and consider using transactions.

If you don't particularly care about generating individual errors for each message, your model function can be simplified a bit:

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 will just attempt to delete the records. If they don't exist they will be ignored, and $this->db->affected_rows() should return the number of messages deleted. You can compare it to count($message_ids) if you want to ensure that all messages selected were deleted, or use this example method that only checks if at least one message was deleted. If the message doesn't exist, you don't need to delete it anyways.

All the stuff Chris Schmitz mentioned is correct and important as well, you have some very basic errors. You may want to cast to array instead of assigning $checked_messages to an empty array if you expect you may be passing a single id (integer or string) to this function. Like this:

$message_ids = (array) $message_ids;

Solution 2

You are assigning $checked_msg to the inputs that are checked, but then you are passing a different variable called $checked_messages to the model. You'll want to pass the $checked_msg var to the model.

Also, in your model, you are redeclaring the $checked_messages var and setting it to an empty array. You'll need to remove that otherwise it will overwrite the info you are passing to the method.

Share:
16,205
CyberJunkie
Author by

CyberJunkie

Updated on June 04, 2022

Comments

  • CyberJunkie
    CyberJunkie almost 2 years

    I'm trying to delete multiple private messages from my database by selecting multiple checkboxes in the inbox and clicking submit to delete. I have the code below but nothing happens. I'm not sure what I'm missing..

    View:

    <?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>
    

    Controller:

    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                                     
            }
    
    }
    

    Model:

    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;
    }
    
  • CyberJunkie
    CyberJunkie over 12 years
    Sorry, I made that mistake making the code readable. In my original script they are the same.
  • CyberJunkie
    CyberJunkie over 12 years
    Thanks for the suggestions! I did not know about continue and transactions. For the loop I had to use ($checked_messages as $key => $msg_id).. I wasn't getting the value of the array item.