Codeigniter удалить несколько строк с флажками - PullRequest
4 голосов
/ 24 августа 2011

Я пытаюсь удалить несколько личных сообщений из моей базы данных, установив несколько флажков в папке «Входящие» и нажав «Отправить» для удаления. У меня есть код ниже, но ничего не происходит. Я не уверен, что мне не хватает ..

Вид:

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

4 голосов
/ 24 августа 2011

В вашем текущем методе delete_checked() вы return ing FALSE, как только первое сообщение "найдено", которое не существует, это предотвратит удаление остальных сообщений как return остановит выполнение цикла. Если вы хотите сделать это таким образом, используйте continue вместо этого и рассмотрите возможность использования транзакций .

Если вы не особенно заботитесь о создании отдельных ошибок для каждого сообщения, функция вашей модели может быть немного упрощена:

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), если хотите убедиться, что все выбранные сообщения были удалены, или использовать этот пример метода, который проверяет, было ли удалено хотя бы одно сообщение. Если сообщение не существует, вам все равно не нужно его удалять.

Все, что упомянул Крис Шмитц также правильно и важно, у вас есть некоторые очень простые ошибки. Возможно, вы захотите привести к массиву вместо , присваивая $checked_messages пустому массиву, если вы ожидаете, что вы передаете один идентификатор (целое число или строку) этой функции. Как это:

$message_ids = (array) $message_ids;
1 голос
/ 24 августа 2011

Вы присваиваете $checked_msg проверенным входам, но затем передаете другую переменную с именем $checked_messages в модель.Вы захотите передать переменную $checked_msg в модель.

Кроме того, в вашей модели вы переделкарируете переменную $checked_messages и устанавливаете ее в пустой массив.Вам нужно будет удалить это, иначе оно перезапишет информацию, которую вы передаете методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...