【问题标题】:DataTables in Codeigniter (display million rows of data)Codeigniter 中的 DataTables(显示百万行数据)
【发布时间】:2020-09-22 10:04:10
【问题描述】:

我在 codeigniter 中创建了一个 DataTable,它已经在处理少量数据,但我想用 100 万行数据运行该项目。不幸的是,它无法处理如此大量的数据。

我应该在下面的代码中添加/更改什么? 我正在使用 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();
    }

【问题讨论】:

  • “它不起作用”是什么意思?你得到一个明确的错误/你的请求超时/其他失败类型?
  • 请求超时。
  • 您应该使用 ajax 来获取特定数量的数据而不是所有行。数据表通常隐藏其他行并显示 10 页。但浏览器无法承受海量数据的压力

标签: oracle codeigniter datatables odbc


【解决方案1】:

您试图在内存中加载大量数据,从而使您自己的服务器崩溃。

检查这个server-side processing (5,000,000 rows) DataTable sample - 不幸的是,这个例子没有使用真正的数据库连接来检索数据,但它仍然提供信息。

本质上,您需要更改 AJAX 请求以包含 offsetlimit,这些值需要添加到您的查询中,以便从数据库中仅检索要显示的数据而不是整个数据表。

试试这个:

  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"); 

    ...

注意:这些代码 sn-ps 并不完美(我之前没有使用过 DataTable)但它们应该可以帮助您走上正轨。

【讨论】:

  • 关于行限制语法,Oracle 12c 引入了OFFSET / FETCH like:SELECT last_name FROM employees ORDER BY last_name OFFSET :offset ROWS FETCH NEXT :maxnumrows ROWS ONLY。使用绑定变量(如图所示)来提高性能和安全性。对于早期的 Oracle 版本,请查看 Oracle 免费The Underground PHP and Oracle Manual 第 181 页“限制行和创建分页数据集”的ROWNUM
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多