обновление нескольких строк с помощью codeigniter - PullRequest
1 голос
/ 04 мая 2011

У меня возникли проблемы с продолжением моего первого проекта codeigniter, и я чувствую, что ответ действительно близок ...

Я заполняю форму полей ввода из базы данных, и когда пользователь отправляет форму, она должна проходить по строкам базы данных и обновлять содержимое на основе 'id' каждой строки.

Моя форма (в представлении admin.php) выглядит примерно так:

<?php echo form_open('admin/update'); ?>
<?php foreach($content as $row) : ?>

<?php echo form_input('id['. $row->id .'][id]', $row->id); ?>
<?php echo form_input('id['. $row->id .'][order]', $row->order); ?>
<?php echo form_input('id['. $row->id .'][title_text]', $row->title_text); ?>
<?php echo form_textarea('id['. $row->id .'][body_text]', $row->body_text); ?>
<?php

if ($row->visibility == 'visible') {
    echo form_checkbox('id['. $row->id .'][visibility]', 'visibility', TRUE);
} else {
    echo form_checkbox('id['. $row->id .'][visibility]', 'visibility', FALSE);
}

?>

<?php endforeach;?>
<?php echo form_submit('Save Changes', 'Save Changes'); ?>
<?php echo form_close(); ?>

Теперь, большая часть этого основана на обучающих материалах и справочных документах. Вот код из контроллера «admin», который я вызываю, когда люди нажимают «Сохранить изменения»:

function update()
{
    $this->load->model('admin_model');
    $this->admin_model->updateRecords($_POST['id']);
    $this->index();
}

Затем данные передаются в модель, где функция выглядит следующим образом:

function updateRecords($data) 
{
    $this->db->insert_batch('content', $data);  
}

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

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

id (PRIMARY and AUTOINCREMENT)
order
title_text
body_text
visibility
origin_date

Заранее большое спасибо:)

1 Ответ

1 голос
/ 04 мая 2011

Вот как я могу это сделать, я добавил в базовую обработку ошибок;Надеюсь, это само собой объясняется:

Модель

function updateRecords($records) 
{
    // Method 1
    // If you want to proceed if there is an error
    $errors = array();

    // Method 2
    // If you want to rollback if there is an error
    $this->db->trans_start();

    foreach ($records as $id => $values):

        // Your form fields conveniently match the column names
        // No need to create the data array, we already have it
        // If you want to update `origin_date` just do this:
        // $values['origin_date'] = time();

        // See if checkbox values were sent
        // Assumes visibility is integer
        if (empty($values['visibility']))
        {
            $values['visibility'] = 0;
        }
        else
        {
            $values['visibility'] = 1;
        }

         // Using method 1, store the error id in an array
        $this->db
            ->where('id', $id)
            ->update('content', $values) OR $errors[] = $id;

        // If using method 2, stop the loop
        $this->db
            ->where('id', $id)
            ->update('content', $values) OR break;


    endforeach;

    // Method 1
    // Return the array of failed updates
    // Controller will check if the array is empty
    // You can tell the user which updates failed or just how many
    return $errors;

    // Method 2
    // This will return TRUE or FALSE
    $this->db->trans_complete();
    return $this->db->trans_status();
}

Контроллер

function update()
{
    $records = $this->input->post('id');
    $this->load->model('admin_model');

    // Make sure to return errors here if they occur

    // Using method 1
    $errors = $this->admin_model->updateRecords($records);
    $num_errors = count($errors);
    if ($num_errors > 0)
    {
        echo "There were {$num_errors} errors!";

        // You can optionally print which records had errors
        echo "There were errors updating these rows: ".implode(', ', $errors);
    }

    // Using method 2
    $success = $this->admin_model->updateRecords($records);
    if ( ! $success)
    {
        echo "Error performing update, no records were saved.";
    }

    $this->index();
}

Конечно, не просто выводите сообщения об ошибках, используйте какую-то библиотеку сообщений, данные сеансаили отправьте переменные в представление.Некоторые ссылки:

http://codeigniter.com/user_guide/database/transactions.html

http://codeigniter.com/user_guide/database/active_record.html#update

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