【问题标题】:Datatables data filtering with multiple checkboxes (server-side)带有多个复选框的数据表数据过滤(服务器端)
【发布时间】:2019-05-05 14:41:18
【问题描述】:

我正在使用具有服务器端处理功能的 DataTables 来显示数万行。我需要通过复选框过滤这些数据。我能够制作一个工作正常的复选框,但我不知道如何添加多个复选框以协同工作。我在这里找到了similar solution,但我的技能不允许我根据需要对其进行修改:(这是我尝试过的..

我的 index.php:

Statuses:<br>
<input type="checkbox" id="0" onclick="myCheckFunc()" name="statuses">Open<br>
<input type="checkbox" id="1" onclick="myCheckFunc()" name="statuses">Closed<br>
<input type="checkbox" id="2" onclick="myCheckFunc()" name="statuses">Solved<br>

<script>
var idsa = 5;
$('input[name=statuses]').click(function(){
        idsa = [];
        $('input[name=statuses]:checked').each(function() {
                idsa.push($(this).attr('id'));
        });
        idsa = idsa.join(",");
        console.log("idsa fcia: " + idsa);
        $('#example').DataTable().ajax.reload();
});
</script>

idsa 变量最初设置为 5,这意味着所有状态(未选中复选框)然后使用它的 format(d) 函数发送到服务器端脚本(这部分工作正常)。这就是我在服务器端脚本中修改 sql 查询的方式:

if ($_GET['idsa'] == 5){
         $idsa = "0,1,2"; 
} else { if (isset($_GET['idsa'])) {
         $idsa = "('" . str_replace(",", "','", $_GET['idsa']) . "')"; } 
} 
$whereAll = "STATUS IN ($idsa)";

编辑: 现在点击这三个复选框中的第一个后,数据被正确过滤(打开状态为 0 的工单),但取消选中不要带回所有数据的初始状态。当我点击其他两个时,数据会被过滤,但是当我取消选中时,数据会被第一个过滤器(打开)过滤。当我单击两个或更多复选框时,我收到此错误:

发生 SQL 错误:SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列

【问题讨论】:

  • 你能创建sn-p吗?
  • 您好,只是代码,这很好,但我从本地数据库动态加载数据,我无法向公众公开这些数据。我认为可以用样本数据来做到这一点,但它不是太复杂了吗?我不知道,我在制作前端部分简单问题的“工作”示例方面有一些经验,但这对我来说听起来有点难。
  • 创建样本数据就足够了。

标签: javascript jquery datatables


【解决方案1】:

好的,这是工作代码:

Status:<br>
  <input type="checkbox" id="0" name="statuses">Open<br>
  <input type="checkbox" id="1" name="statuses">Closed<br>
  <input type="checkbox" id="2" name="statuses">Solved<br>

<script>
var idsa = 5;
$('input[name=statuses]').click(function(){
        idsa = [];
        $('input[name=statuses]:checked').each(function() {
                idsa.push($(this).attr('id'));
        });
        idsa = idsa.join(",");
        console.log("idsa fcia: " + idsa);
        if (idsa == '') {
                idsa = 5;
        }
        $('#example').DataTable().ajax.reload();
});
</script>

在服务器端脚本中:

if ($_GET['idsa'] == 5){
        $idsa = "0,1,2";
} else {
        $idsa = $_GET['idsa'];
}
$whereAll = "STATUS IN ($idsa)";

问题在于我从其他人那里获取的服务器端部分,并添加了另一个逗号。现在它工作正常。非常感谢您的宝贵时间。

【讨论】:

    【解决方案2】:

    尝试将您的 STATUS 列名包含在反引号中,这似乎是 MySQL 关键字

    【讨论】:

    • 嗨,Alexey,我认为这不是问题,但我当然测试过 - 没有变化 :(
    • 您是否能够在启动前记录已填写参数的查询或将其转储?我建议使用 mysql 代理来查看服务器获取的内容,或者如果您不想安装它,您可以尝试在 PHP 中启动之前转储完整查询
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2013-09-22
    • 1970-01-01
    • 2019-08-23
    • 2012-10-17
    相关资源
    最近更新 更多