Codeigniter使用复选框删除多行

时间:2011-08-24 16:00:36

标签: php mysql database 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;
}

2 个答案:

答案 0 :(得分:4)

在您当前的delete_checked()方法中,只要“找到”第一条消息不存在,您就return FALSE,这将阻止其余消息从return删除将停止执行循环。如果您想这样做,请改用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;

答案 1 :(得分:1)

您正在为已检查的输入分配$checked_msg,但是您正在将另一个名为$checked_messages的变量传递给模型。您需要将$checked_msg var传递给模型。

此外,在您的模型中,您将重新声明$checked_messages var并将其设置为空数组。您需要删除它,否则它将覆盖您传递给方法的信息。