Codeigniter: sql срабатывает только при изменении текстового поля в форме обновления - PullRequest
0 голосов
/ 06 октября 2011

У меня проблема с формой обновления. Это форма «Сведения о клиенте», в которой поля предварительно заполнены данными из БД.

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

После тестирования я знаю, что форма отправляет данные, и я знаю, что модель получает их. Просто кажется, что он вообще не выполняет запрос. disabled_rows () равно нулю и не возвращает ошибок.

Как будто CI проверяет перекрестные проверки полей перед выполнением SQL.

Но если вы измените текстовое поле, все будет работать без проблем.

Мой код массивный, поэтому я опубликую резюме:

Контроллер

if ($this->form_validation->run() == FALSE)
{
 //load views etc
}
else
{
  $title = $this->input->post('title');
  $forename = $this->input->post('forename');
  //etc...
  $this->load->model('Clients_model');

  $update_sql = $this->Clients_model->update_client(
                           $title,
                           $forename,
                           $surname,
                           $dob,
                           $email,
                           $address1,
                           $address2,
                           $town,
                           $county_state_id,
                           $address_code,
                           $country_id,
                           $alt_address1,
                           $alt_address2,
                           $alt_town,
                           $alt_county_state_id,
                           $alt_address_code,
                           $alt_country_id,
                           $use_alt_address,
                           $phone_land,
                           $phone_mobile,
                           $client_type,
                           $cancer_profile,
                           $communication_method,
                           $involvement,
                           $status,
                           $client_id
  );
  $this->session->set_flashdata('msg', $update_sql);
  redirect('/clients', 'refresh');
}  

Модель

function update_client($title,
                     $forename,
                     $surname,
                     $dob,
                     $email,
                     $address1,
                     $address2,
                     $town,
                     $county_state_id,
                     $address_code,
                     $country_id,
                     $alt_address1,
                     $alt_address2,
                     $alt_town,
                     $alt_county_state_id,
                     $alt_address_code,
                     $alt_country_id,
                     $use_alt_address,
                     $phone_land,
                     $phone_mobile,
                     $client_type,
                     $cancer_profile,
                     $communication_method,
                     $involvement,
                     $status,
                     $client_id
)
{
         $this->sql = 'UPDATE client
                       SET
                       title = ?,
                       forename = ?,
                       surname = ?,
                       dob = ?,
                       email = ?,
                       address1 = ?,
                       address2 = ?,
                       town = ?,
                       county_state_id = ?,
                       address_code = ?,
                       country_id = ?,
                       alt_address1 = ?,
                       alt_address2 = ?,
                       alt_town = ?,
                       alt_county_state_id = ?,
                       alt_address_code = ?,
                       alt_country_id = ?,
                       use_alt_address = ?,
                       phone_land = ?,
                       phone_mobile = ?,
                       status = ?
                       WHERE
                       client_id = ?
                       ';
         $this->query = $this->db->query($this->sql, array(
                   $title,
                   $forename,
                   $surname,
                   $dob,
                   $email,
                   $address1,
                   $address2,
                   $town,
                   $county_state_id,
                   $address_code,
                   $country_id,
                   $alt_address1,
                   $alt_address2,
                   $alt_town,
                   $alt_county_state_id,
                   $alt_address_code,
                   $alt_country_id,
                   $use_alt_address,
                   $phone_land,
                   $phone_mobile,
                   $status,
                   $client_id
                   ));
         if ( $this->db->affected_rows() == 1)
         {
          //etc
         }
}

Большое спасибо!

Джо

1 Ответ

0 голосов
/ 06 октября 2011

Все выглядит хорошо, и у меня никогда не было таких проблем с использованием CI ... Вы пробовали использовать Active Record, просто как эксперимент? Здесь я использовал более простую версию, которая передает не все параметры функции, а только весь массив записей; таким образом, вы не рискуете пропустить или удвоить какой-либо параметр!

Контроллер:

  //...
 $update_sql = $this->Clients_model->update_client($this->input->post());
 //...

Модель:

function update_client($post)
{
  if(!is_array($post))
  { 
     return 'error in passing POST data';
  }
  $fields = array ('title' => $post['title'], 'forename' => $post['forname'], ....);
  $client_id = $post['client_id'];
  $this->db->where('client_id',$client_id);
  $this->db->update('client',$fields);
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...