Почему CI создает новую строку вместо обновления? - PullRequest
0 голосов
/ 15 июня 2019

Я создаю пользовательский интерфейс в своем приложении, который позволит пользователю определять состояние получаемого контента, включая его обновление.Как CI справляется с этим?

Я пробовал различные методы обновления, представленные в части документации по построителю запросов, включая replace и update, которые я передаю данные из представления в контроллер, к модели в виде массива.Тем не менее, когда я пытаюсь это сделать, он создает новую строку с этим единственным значением и со всеми остальными столбцами пустыми.

view.php

<form action="Application/Update" method="get">
<input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
<input type="hidden" name="mar-read" value="New-value">
<?php echo anchor('http://localhost/dir/dir/dir/index.php/Application/Update', 'update'); ?>
</form>

controller.php

public function Update() {

  $this->load->helper('url');
  $this->load->model('Main');

  $id = $this->input->post('mar-id');
  $value = $this->input->post('mar-read');

  $mar = $this->Main->Update($id, $value);

  if ($mar == TRUE) {
    redirect('http://localhost/dir/dir/dir/index.php/Application/Otherpage', 'refresh');
  }
  else {
    redirect('http://localhost/dir/dir/dir/index.php/Application/Otherpage');
  }
}

model.php

public function Update($id, $value) {

  $data = array(
    'status' => $value
  );
  $this->db->where('id', $id);
  $update = $this->db->update('table', $data);

}

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

1 Ответ

2 голосов
/ 15 июня 2019

Здесь есть ряд ошибок.

На сегодняшний день мы установили, что выполнение var_dumps в контроллере приводит к NULL для всех ваших значений "POST".

Я предположилдля простоты следующее.

Имя контроллера: Program.php (Приложение НЕ является допустимым именем контроллера, так как это имя-имя)

Название модели:Mdl_update.php

Представление: update_view.php

Проблема № 1: В вашей форме возникла проблема, когда вы используетеякорный тег, который является просто ссылкой.Он ничего не делает при отправке каких-либо данных из формы.

Поэтому мы должны удалить тег привязки и заменить его формой отправки.Вы должны отправить форму, чтобы получить шанс на отправку данных формы.

Для тестирования ваших GET и POST я добавил в две разные формы. In update_view.php

<!-- Set the Method to GET -->
<form action="program/update" method="get">
    <input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
    <input type="hidden" name="mar-read" value="New-value">
    <input type = "submit" name="update" value="Update with GET">
</form>

<!-- Set the Method to POST as this is what the Controller is Expecting -->
<form action="program/update" method="post">
    <input type="hidden" name="mar-id" value="<?php echo $row['id']; ?>">
    <input type="hidden" name="mar-read" value="New-value">
    <input type = "submit" name="update" value="Update with POST">
</form>

То, что я использовал для отображения формы в контроллере, просто вызывая программу / индекс в контроллере программ.

public function index() {
    $this->load->helper('url');
    $data['row'] = array('id' => 2);
    $data = $this->load->view('update_view', $data, TRUE);
    echo $data;
}

Таким образом, ваш контроллер ищет POST, а не GET.Это можно доказать, немного изменив контроллер для отладки.

public function update() {
    $this->load->helper('url');
    $this->load->model('mdl_update');

    $id = $this->input->post('mar-id');
    $value = $this->input->post('mar-read');

    echo '<h2>POST Values</h2>';
    var_dump($id);
    var_dump($value);

    // ****************************
    // These are added in for debugging/Demonstration to show values for the form using the GET method.
    $id_get = $this->input->get('mar-id');
    $value_get = $this->input->get('mar-read');

    echo '<h2>GET Values</h2>';
    var_dump($id_get);
    var_dump($value_get);
    // ****************************

    exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__); // Added for Debug

    $mar = $this->mdl_update->Update($id, $value);

    if ($mar == TRUE) {
        redirect(base_url('program/otherpage'), 'refresh');
    } else {
        redirect(base_url('program/otherpage'));
    }
}

Итак, вы ищете POST-данные, когда для вашего метода формы установлено значение GET.Пожалуйста, знайте, что вы устанавливаете.Они должны совпадать.

Если вы хотите использовать GET, вам нужно использовать $this->input->get() Приведенный выше код позволит вам проверить оба.

Итак, теперь у вас есть POST и GET Form иКонтроллер настроен для демонстрации двух разных типов.Выберите либо ПОЛУЧИТЬ или ПОСТ!Это зависит от вас, какой из них вы выберете.

Проблема № 2: Ожидайте возвращаемое значение от вашей модели, когда вы ничего не возвращаете.

В вашем контроллереу вас есть строка ...

$mar = $this->mdl_update->Update($id, $value);

А в вашей модели у вас есть ...

public function update ($id,$value) {
    $data = array(
        'status' => $value
    );
    $this->db->where('id', $id);
    $this->db->update('db_table', $data);
}

Ваш метод модели ничего не возвращает.Вы всегда должны искать, каковы ваши возвращаемые значения.Я ожидаю, что вы намеревались вернуть стоимость обновления.Просматривая сам код CI, кажется, что если что-то пойдет не так, он вернет FALSE (если отладка базы данных отключена - узнал что-то новое)

Я добавил некоторую отладку, чтобы помочь в просмотре происходящего.здесь.

public function update($id, $value) {
    $data = array(
        'status' => $value
    );
    $this->db->where('id', $id);
    $update_result = $this->db->update('db_table', $data);

    echo $this->db->last_query(); // Added for DEBUG

    return $update_result;
}

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

Если мы изменим контроллер для просмотра модели и т. Д. (Я только показываю изменения), мы изменим

exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__);

$mar = $this->mdl_update->Update($id, $value);

На это

$mar = $this->mdl_update->Update($id, $value);
var_dump($mar);
exit('Stopped for Debugging: Method '. __METHOD__.' at Line: '.__LINE__);

Если вы запустите это и отправите либоGET (результаты NULL) или POST, обновление всегда будет возвращать TRUE.Таким образом, ваше перенаправление и т. Д. Нужно посмотреть на то, как вы выбираете тот или другой.

Я думаю, вы должны установить столбцы таблицы так, чтобы они не были пустыми, и добавить некоторую «валидацию» в вашем контроллере..

ВЫПУСК 3: Нет проверки формы CodeIgniter имеет класс проверки формы, который я предлагаю вам прочитать.Это становится слишком длинным, чтобы вдаваться в подробности ...

Так что, пройдя через это, вы можете добавить / удалить отладку, чтобы проверить, что происходит, и продвинуться по пути, как я надеюсь, показал.

если что-то неясно, просто спросите.Я уверен, что мог что-то пропустить.

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