ошибка при поиске данных с мультиселектом в CI - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в КИ. На моей странице просмотров у меня есть окно поиска, которое использует множественный выбор. Поэтому я могу выбрать некоторые данные, и поиск основан на данных, которые я выбрал. Но когда я нажимаю кнопку Показать данные, появляется ошибка

«Сообщение: преобразование массива в строку»

и не может показать результаты. Как это решить?

Это страница контроллера

     function get_menu_access_report()
{
      $menu_cos = $_POST['menu_cos'];
      $menu_list = $_POST['menu_list'];
      if(isset($menu_cos)&&isset($menu_list)){
      die(json_encode($this->menu_model->get_menu_access_report($menu_cos,$menu_list)));
      }

}

Это страница модели

function get_menu_access_report($menu_cos, $menu_list){


    $query="
            SELECT osC.name AS project, mn.name AS menu_name, bp.name AS employee, MAX(tm.is_all_data) AS all_data, 
            GROUP_CONCAT(t.name SEPARATOR '<br>') AS title
            FROM db_mstr.m_menu mn 
            JOIN db_mstr.m_grp_menu_dt gmd ON mn.id = gmd.menu_id
            JOIN db_mstr.m_grp_menu gm ON gmd.grp_menu_id = gm.id
            JOIN db_mstr.m_title_menu tm ON gm.id = tm.grp_menu_id
            JOIN db_mstr.m_title t ON tm.title_id = t.id
            JOIN db_mstr.m_os os ON t.os_id = os.id
            JOIN db_mstr.m_os osC ON os.cos_id = osC.id
            JOIN db_mstr.m_bp_title bpt ON t.id = bpt.title_id AND bpt.is_deleted=0
            JOIN db_mstr.m_bp bp ON bpt.bp_id = bp.id
            where  mn.id='$menu_list' and osC.id = '$menu_cos' 
            GROUP BY project,employee";

        return $this->db->query($query)->result();
 }

Это страница просмотра и JS

                     <label class="control-label col-sm-2">Project</label>
                        <div class="col-sm-4">
                            <select required multiple="multiple" id="menu_cos" name="menu_cos" class="" style="width:100%" data-placeholder="">

                                 <?php
                                  foreach ($comboCompany as $key)
                                  {
                                    ?><option value="<?=$key->value?>" >  <?=$key->text?> <?php
                                  }
                                  ?>
                            </select>
                        </div>
                       <label class="control-label col-sm-1" style="padding-left: 4px;padding-right: 3px;">Menu Name</label>
                        <div class="col-sm-4">
                            <input type="hidden" name="menu_list" id="menu_list" class="" style="width:100%">
                        </div>

                        <div class="col-sm-1">
                            <button type="button" class="btn btn-primary" onclick="show_data_menu();">Show Data</button>
                        </div>

  <script>
      $(document).ready(function() {
       $('#menu_cos').multiselect('destroy');
       $('#menu_cos').multiselect({
       maxHeight :400,
       includeSelectAllOption: true,
       enableCaseInsensitiveFiltering: true,
       numberDisplayed: 3,
       nonSelectedText: 'None selected',
           });  
       });

   function show_data_menu(){

    jQuery.ajax({
        type: 'POST',
        url: "<?php echo base_url()?>index.php/menu/get_menu_access_report",
        dataType: "json",
        data:
        {
            menu_cos : $('#menu_cos').val(),
            menu_list : $('#menu_list').val()
        },
        success: function(data)
        {

            $('#menu_th').DataTable().clear();
            if(data.length>0)
            {
                <?php
                ?>
                    for (var i = 0; i < data.length; i++)
                    {

                        if(data[i].all_data=='1')
                        {
                            var title = data[i].title+" (all)";
                        }
                        else 
                        {
                            var title =data[i].title;
                        }
                        $('#menu_th').DataTable().row.add([
                        data[i].project,data[i].employee,data[i].all_data,title]).draw( false );
                    }
                <?php
                ?>
            }
            else
            {
                $('#menu_th').DataTable().draw();
            }


        },
        error: function(jqXHR, textStatus, errorThrown) {
            //alert(errorThrown);
        }
    });
           }
         </script>

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я думаю, что проблема здесь: -

<select required multiple="multiple" id="menu_cos" name="menu_cos" class="" 
style="width:100%" data-placeholder="">

Вы отправляете массив значений, и Модель ожидает только одно значение для извлечения данных.

Вы можете использовать функцию разнесения PHP.Вот ссылка: - https://www.php.net/manual/en/function.explode.php

И вы должны использовать where_in в Model вместо where.

Пожалуйста, скажите, было ли это полезно.

0 голосов
/ 23 мая 2019

Попробуйте использовать функцию JavaScript JSON.parse() для преобразования возвращаемых данных ajax в объект JavaScript:

function show_data_menu(){

    jQuery.ajax({
        type: 'POST',
        url: "<?php echo base_url()?>index.php/menu/get_menu_access_report",
        dataType: "json",
        data:
        {
            menu_cos : $('#menu_cos').val(),
            menu_list : $('#menu_list').val()
        },
        success: function(report) // changed to report
        {
            let data = JSON.parse(report); // parse report data

            $('#menu_th').DataTable().clear();
            if(data.length>0)
            {
                <?php
                ?>
                    for (var i = 0; i < data.length; i++)
                    {

                        if(data[i].all_data=='1')
                        {
                            var title = data[i].title+" (all)";
                        }
                        else 
                        {
                            var title =data[i].title;
                        }
                        $('#menu_th').DataTable().row.add([
                        data[i].project,data[i].employee,data[i].all_data,title]).draw( false );
                    }
                <?php
                ?>
            }
            else
            {
                $('#menu_th').DataTable().draw();
            }


        },
        error: function(jqXHR, textStatus, errorThrown) {
            //alert(errorThrown);
        }
    });
}

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

Я думаю, у вас есть menu_cos вход, установленный как массив, попробуйте изменить:

$menu_cos = $_POST['menu_cos'];

до:

$menu_cos = implode(',', $_POST['menu_cos']); // the resulting condition will be like : "1,2,3,.."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...