Таблицы данных в Codeigniter (отображение миллионов строк данных)

#oracle #codeigniter #datatables #odbc

#Oracle #codeigniter #таблицы данных #odbc

Вопрос:

Я создал таблицу данных в codeigniter, и она уже работает с небольшим объемом данных, но я хочу запустить проект с 1 миллионом строк данных. К сожалению, он не работает с таким огромным объемом данных.

Что я должен добавить / изменить в своем коде ниже? Я использую codeigniter, базу данных oracle и драйвер odbc

Спасибо!

 //JavaScript

    <script>

 $('#user-list').DataTable({
    
  "processing": true,
 
 
    dom: 'Bfrtip',
        buttons: [
            'excel'
        ],
          
        "ajax": {
            url : "<?php echo base_url(); ?>Reports/get_User,
            type : 'GET'
        },
         

         "aoColumns": [
          { "data": "ID" },
          { "data": "FirstName" },  
          { "data": "LastName" },
          { "data": "Address"},
          { "data": "Email" },
  
                      
            ]
      
    });

</script>  
 //html

  <table id="user-list" class="table table-bordered table-striped table-hover">
        <thead>
            <tr>
                <th>ID</th>
                <th>First name</th>
                <th>Last name</th>
                <th>Address</th>
                <th>Email</th>
            </tr>
        </thead>
    </table>  

  //controller
 
 public function get_User()
   {
      $draw = intval($this->input->get("draw"));
      $start = intval($this->input->get("start"));
      $length = intval($this->input->get("length"));
    

      $query =$this->db->query("SELECT * FROM users"); 

      
      $data = [];



      foreach($query->result() as $r) {
           $data[] = array(
                $r-ID
                $r-FirstName,
                $r-LastName,
                $r-Address,
            $r-Email,
                $r_tab[] = $r


           );
      }

      $result = array(
               "draw" => $draw,
                 "recordsTotal" => $query->num_rows(),
                 "recordsFiltered" => $query->num_rows(),
                 "data" => $data,
                  "data" =>  $r_tab

            );
      echo json_encode($result);
      exit();
    }  

Комментарии:

1. Что вы подразумеваете под «это не работает»? Вы получаете явную ошибку / время ожидания вашего запроса / другой тип сбоя?

2. Время ожидания запроса истекло.

3. вы должны использовать ajax для получения определенного объема данных вместо всех строк. таблица данных обычно скрывает другие строки и отображает 10 страниц. но браузер не выдерживает давления огромных данных

Ответ №1:

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

Проверьте этот пример обработки данных на стороне сервера (5 000 000 строк) — к сожалению, в этом примере не используется реальное подключение к базе данных для извлечения данных, но он по-прежнему информативен.

По сути, вам нужно изменить свой AJAX-запрос, чтобы включить offset и limit , значения, которые необходимо добавить в ваш запрос, чтобы извлекать из базы данных только данные, которые будут отображаться, а не всю таблицу.

Попробуйте это:

  1. Измените свой вызов AJAX, чтобы он выглядел следующим образом:
         scrollY: 200, 
        "ajax": function ( data, callback, settings ) {
            url : "<?php echo base_url(); ?>Reports/get_User/"   data.start   "/"   data.length,
            type : 'GET'
        },
         
  
  1. Измените свой контроллер следующим образом (возможно, вам также потребуется настроить свои маршруты):
 // Be sure to validate that $offset and $limit are valid numeric values (integer, positive, limit does not exceed a certain value, etc)
public function get_User($offset, $limit)
{
    $limit = (int) $limit;
    $offset = (int) $offset;

    ...
    
    // Not sure about the "LIMIT" syntax for Oracle, please look it up
    $query =$this->db->query("SELECT * FROM users LIMIT $offset, $limit"); 

    ...

  

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

Комментарии:

1. Что касается синтаксиса ограничения строк, Oracle 12c представила OFFSET / FETCH like : SELECT last_name FROM employees ORDER BY last_name OFFSET :offset ROWS FETCH NEXT :maxnumrows ROWS ONLY . Используйте переменные привязки (как показано) для повышения производительности и безопасности. Более ранние версии Oracle см. ROWNUM на стр. 181 «Ограничение строк и создание постраничных наборов данных» бесплатного руководства Oracle по подпольному PHP и Oracle .