Как добавить несколько выбранных значений в один столбец в PHP CodeIgniter? - PullRequest
0 голосов
/ 23 июня 2019

Я работаю над проектом, в котором мне нужно добавить несколько выбранных значений в один столбец, используя Php CodeIgniter.Вот фактическое постановка задачи: у меня есть столбец INT total_persons для хранения общего количества людей (т.е. 5) и столбец VARCHAR person_names , в котором будут храниться имена этих 5 человек.

Чтобы выбрать нескольких пользователей из выпадающего списка, я использую библиотеку Select2.Но когда я отправляю данные, появляется следующее сообщение об ошибке

Поле «Персональные имена» является обязательным. Конечно, потому что я установил правила проверки в форме следующим образом:

$ this-> form_validation-> set_rules ('person_names', 'Persons Names', 'required');

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

Если я добавляю идентификатор одного пользователя (оставляя столбец INT) вместо нескольких выбранных значений, он работает нормально и отправляет данные в БД.Но когда я пытаюсь сохранить несколько имен пользователей, выдает ошибку, которую я вставил выше.

Вот мой Expense.php код из контроллера

    function add()
    {   
        $this->load->library('form_validation');

        $this->form_validation->set_rules('expense_type','Expense Type','required');
        $this->form_validation->set_rules('person_names','Person Names','required');
        $this->form_validation->set_rules('total_persons','Total Persons','required');
        $this->form_validation->set_rules('expense_amount','Expense Amount','required');
        $this->form_validation->set_rules('expense_details','Expense Details','required');
        $this->form_validation->set_rules('date_added','Date Added','required');

        if($this->form_validation->run())     
        {   
            $params = array(
                'expense_type' => $this->input->post('expense_type'),
                'total_persons' => $this->input->post('total_persons'),
                'person_names' => $this->input->post('person_names'),
                'expense_amount' => $this->input->post('expense_amount'),
                'expense_details' => $this->input->post('expense_details'),
                'date_added' => $this->input->post('date_added'),
                'update_date' => $this->input->post('update_date'),
            );

            print_r($params);
            exit();

            $expense_id = $this->Expense_model->add_expense($params);
            redirect('expense/index');
        }
        else
        {
            $this->load->model('Expense_type_model');
            $data['all_expense_type'] = $this->Expense_type_model->get_all_expense_type();

            $this->load->model('User_model');
            $data['all_users'] = $this->User_model->get_all_users();

            $data['_view'] = 'expense/add';
            $this->load->view('layouts/main',$data);
        }
    }  

Expense_Model.php

    function add_expense($params)
    {
        $this->db->insert('expense',$params);
        return $this->db->insert_id();
    }

view.php

    <div class="col-md-6">
        <label for="person_names" class="control-label"><span class="text-danger">*</span>Person Names</label>
        <div class="form-group">
            <select name="person_names[]" class="form-control multiselect" multiple="multiple">
                <option value="">select user</option>
                    <?php 
                        foreach($all_users as $user)
                        {
                            $selected = ($user['user_name'] == $this->input->post('person_names')) ? ' selected="selected"' : "";

                            echo '<option value="'.$user['user_name'].'" '.$selected.'>'.$user['user_name'].'</option>';

                        } 
                    ?>
           </select>

            <span class="text-danger"><?php echo form_error('person_names');?></span>
        </div>
    </div>

Если я не пропущу какой-то ключевой момент, код должен добавить пять имен вполе user_name следующим образом? ["user1", "user2", "user3", "user4", "user5"] (это мое предположение, извинения, если я догадалась)

Может кто-топомогите разобраться, где я совершаю ошибку?

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

Ответы [ 2 ]

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

Класс проверки формы CodeIgniter поддерживает использование массивов в качестве имен полей . Чтобы использовать его, вам необходимо включить [] в правила проверки:

$this->form_validation->set_rules('person_names[]','Person Names','required');

А также на форме ошибка:

form_error('person_names[]')

Редактировать

Чтобы сохранить массив в одном столбце, вы можете сначала json_encode , чтобы получить строку в формате json, которую вы можете получить позже в виде массива, используя json_decode :

$params = array(
    'expense_type' => $this->input->post('expense_type'),
    'total_persons' => $this->input->post('total_persons'),
    'person_names' => json_encode($this->input->post('person_names')),
    'expense_amount' => $this->input->post('expense_amount'),
    'expense_details' => $this->input->post('expense_details'),
    'date_added' => $this->input->post('date_added'),
    'update_date' => $this->input->post('update_date'),
);
0 голосов
/ 24 июня 2019

Таким образом, вы можете сохранить несколько идентификаторов людей в одном столбце, разделив их пробелом .

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

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select class="form-control" id="alertrecepients" name="alertrecepients" multiple size="10">
 <?php
    if(!empty($users)){
        foreach ($users as $cl){
 ?>
   <option value="<?php echo $cl->userId ?>"
<?php 
   $x = 0;
   $paramArray31=explode(' ',$alertrecepients);
   $limit= count($paramArray31);
   while($x <= $limit-1) {
      if ($paramArray31[$x] == $cl->userId) {
        echo "selected";
      }
      $x++;
   }
?>>
<?php echo $cl->name ?></option>
<?php }} ?>
</select>

<script>
    $( "select[name='alertrecepients']" )
    .change(function() {
    var str = "";
    $( "select[name='alertrecepients'] option:selected" ).each(function() {
    str += $( this ).val() + " ";
    });
    $( "#selectedrecepients" ).val( str );
    })
    .trigger( "change" );
</script>

<input type="hidden" value="<?php echo $alertrecepients; ?>" name="selectedrecepients" id="selectedrecepients" />

I am not familiar with snippet, so i am posting answer like this.
...