无法使用数据表停止初始排序

Posted

技术标签:

【中文标题】无法使用数据表停止初始排序【英文标题】:Unable to stop initial sorting using datatables 【发布时间】:2015-08-25 13:46:09 【问题描述】:

我正在使用datatables 1.10.7。

我在这里引用的原始问题Question on datatables forum

我想禁用数据表自动执行的初始排序。

Datatables 拒绝收听

"aaSorting": []

"aaSorting": [[0,'desc'],[1,'desc']]

它按 ASC 顺序按表格中的第一列排序。阻止这种情况的唯一方法是使用

"bSort": false

但是,这会删除我桌子上的所有排序功能。

除了排序之外,我的表 100% 可用于其他所有操作。过滤、搜索、分页等工作 100%。当我设置

"bSort" : true

或者,当我忽略它时,因为我相信默认值是 true,我在警报消息中收到以下错误:

"error":"出现 SQL 错误:SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 mysql 服务器版本相对应的手册以获取正确的语法在第 4 行的“ORDER BY column1 ASC LIMIT 0, 10”附近”

我尝试过使用和不使用 aaSorting,使用和不使用 bSort,并以各种方式将它们混合在一起。

有什么帮助吗?

PS,这是我的表定义:

oTable = $('#table_demo').DataTable(

    "bSort": true,
    "aaSorting": [[0,'desc'],[1,'desc']],
    "bJQueryUI": true,
    "bPaginate": true,
    "bStateSave": true,
    "processing": true,
    "serverSide": true,
    "sPaginationType": "full_numbers",
    "ajax":
    
        "url": "view_demo_remote.php",
        "data":
        
            "field1": "".$_SESSION['field1']."",
            "field2": "".$_SESSION['field2']."",
            "field3": "".$_SESSION['field3'].""
        
    ,
    "columns":[
         "bSortable": true, "data": "col1" ,
         "bSortable": true, "data": "col2" ,
         "bSortable": true, "data": "col3" ,
         "bSortable": false, "data": "col4" ,
         "bSortable": false, "data": "col5" ,
         "bSortable": false, "data": "col6" 
    ],
    "fnCreatedRow": function( nRow, aData, iDataIndex )
    
        $(nRow).attr("attrname",aData["col1"]);
    ,
    "fnDrawCallback": function( oSettings )
    

    
);

编辑:

我也尝试从最新的 api 使用它,但没有成功:

"order": []

编辑:

这是我用于服务器端处理的 view_demo_remote.php:

<?php
    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Easy set variables
     */

    /* Array of database columns which should be read and sent back to DataTables. Use a space where
     * you want to insert a non-database field (for example a counter or static image)
     */

    session_start();

        $table = 'table_demo';

        $primaryKey = 'id';

        $field1 = mysql_real_escape_string($_REQUEST["field1"]);
        $field2 = mysql_real_escape_string($_REQUEST["field2"]);
        $field3 = mysql_real_escape_string($_REQUEST["field3"]);


    $columns = array(
            array(
                'db' => 'id',
                'dt' => 'DT_RowId',
                'formatter' => function( $d, $row )
                
                    return $d;
                
            ),
            array( 'db' => 'name',   'dt' => 'col1' ),
            array( 'db' => 'surname',   'dt' => 'col2' ),
            array( 'db' => 'title',   'dt' => 'col3' ),
            array( 'db' => 'date',   'dt' => 'col4' ),
            array( 'db' => 'telephone',   'dt' => 'col5' ),
            array( 'db' => 'email',   'dt' => 'col6' )
            );


        $sql_details = array(
                'user' => DBUSER,
                'pass' => DBUSERPASS,
                'db'   => DBNAME,
                'host' => DBHOST
        );


        require( 'libraries/DataTables-1.10.7/examples/server_side/scripts/ssp.class.php' );


        echo json_encode(SSP::complex( $_GET, $sql_details, $table, $primaryKey, $columns, "","name <>'' ORDER BY id DESC, datecreated DESC"));

【问题讨论】:

您使用的是哪个版本的数据表?要使用"aaSorting": [],版本必须为 1.5 或更高版本。见this @BhushanKawadkar 如我帖子的第一行所述,我使用的是 1.10.7。这意味着实际上我应该使用 order 而不是 aasorting,但是,两者都不起作用。 @Janpan:你的数据表代码看起来很完美。我认为问题在于您的 view_demo_remote.php 文件。你能添加你的php代码吗? @AmarKam 肯定会添加它。 只需尝试从 SSP::complex 函数中删除最后两个参数并检查数据表是否有效。 【参考方案1】:

使用order 指定不发生初始排序是完全可以的,请参见下面的示例:

$('#example').dataTable( 
    "order": []
 );

在调用 SSP::complex 时,您的 PHP 代码中有错误。函数需要以下参数

static function complex ( $request, $conn, $table, $primaryKey, $columns, $whereResult=null, $whereAll=null )

但您为 $whereAll 参数指定了 "name &lt;&gt;'' ORDER BY id DESC, datecreated DESC"

如果禁用排序,这可能会起作用,但是当它不是并且对另一列进行排序时,SSP 类将使用两个 ORDER 子句(一个来自 $whereAll 参数,另一个基于被排序的列)导致SQL 错误。

"name &lt;&gt;'' ORDER BY id DESC, datecreated DESC" 替换为"name &lt;&gt;''" 以更正此问题。

【讨论】:

谢谢,成功了!我怀疑这可能是问题的一部分。在使用服务器端时我有点不确定如何订购,我只是将它作为 where 子句的一部分并且它起作用了,但显然它不是为了以这种方式使用而编写的。感谢您的帮助!【参考方案2】:

您是否尝试过调用 order 方法?

var table = $('#example').DataTable();

// Sort by column 1 and then re-draw
table
    .order( [] )
    .draw();

【讨论】:

是的,我有,同样的错误发生了:(我相信错误实际上发生在此之前。 看起来MySql因为格式化的列名column1而抱怨,您应该在查询之前处理它以去除这些标签 抱歉,这只是我从响应字符串中复制它时应用的格式。实际消息显示为纯文本。我将在原始帖子中修复它以避免混淆。

以上是关于无法使用数据表停止初始排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 我无法弄清楚视频停止后如何进入新屏幕

数据表警告(表 id = 'ideas'):无法重新初始化数据表

更新后无法启动嵌套项目/停止在 Typeorm 依赖项初始化

无法停止导入数据

无法以编程方式为 DataTable 设置初始排序顺序

Emgucv 无法使用 EigenFaceRecognizer 训练超过 210 张图像,它会停止写入新的细节或数据