【问题标题】:How to add more filter yet pager using Ajax如何使用 Ajax 添加更多过滤器和寻呼机
【发布时间】:2021-04-04 17:37:17
【问题描述】:

我有以下 ajax 结构,可以显示 10、25、50 和 100 条记录

$(function() {
    $(document).on('click', '.pagination li a', function(evt) {
        evt.preventDefault();
        url = $(this).attr('data-target');
        ajaxLoad(url);
    });

    $('#amount_show').change(function(evt) {
        evt.preventDefault();
        ajaxLoad('pagination.php');
    });

    ajaxLoad('pagination.php');

    function ajaxLoad(url) {
        query_params = {
            amount_show: $('#amount_show').val()
        };
        
        $('.data-pagination').html('<div class="loading">Loading...</div>');
        $.ajax({
            type: "GET",
            url: url,
            data: $.param(query_params),
            success: function(data) {
                $('.data-pagination').fadeOut('1000', function() { $(this).html(data) }).fadeIn('1000');
            }
        });
    }
});

根据我从下面的 HTML 结构中选择的,ajax,它给我带来了正确发送的结果。

<select id="amount_show" name="amount_show">
    <option value="10" selected>10</option>
    <option value="25" >25</option>
    <option value="50" >50</option>
    <option value="100">100</option>
</select>

但我仍然不明白如何向寻呼机添加更多过滤器,例如客户端类型、用户类型或搜索引擎。

或者按日期搜索过滤器,我想在我的分页中添加这么多过滤器,但为此我需要一点点推动如何继续。

这是我的 PHP 代码,你能告诉我如何向寻呼机添加更多过滤器吗?

<?php
    $strs = '';
    $pagination_page = 'pagination.php';
    $defaul_records = 10;

    if (isset($_GET['page'])) {
        $page = $_GET['page'] ? : '';
    } else {
        $page = 1;
    }

    if (isset($_GET['amount_show'])) {
        $records_by_page = $_GET['amount_show'];
    } else {
        $records_by_page = $defaul_records;
    }

    $localization_sql = ($page - 1) * $records_by_page;

    $stmtPD = $con->prepare("SELECT idCliente,
                                    nomCliente
                            FROM cliente
                            ORDER BY idCliente DESC LIMIT $localization_sql, $records_by_page");
    $stmtPD->execute();
    $stmtPD->store_result();

    if ($stmtPD->num_rows > 0):

        ob_start();

        $strs .= '<table id="data-table" class="table bootgrid-table">
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>CLIENTE</th>
                            <th>ACCIÓN</th>
                        </tr>
                    </thead>
                    <tbody>';

        $stmtPD->bind_result(
            $idCliente,
            $nomCliente
        );
        while ($stmtPD->fetch()) {
            $strs .= '<tr>
                        <td>'.$idCliente.'</td>
                        <td>'.$nomCliente.'</td>
                        <td>
                            <span class="view_data" id="'.$idCliente.'">Ver</span>
                            <span class="edit_data" id="'.$idCliente.'">Editar</span>
                        </td>
                    </tr>';
        }
        $stmtPD->close();

        $strs .= '</tbody></table><div class="pagination"><ul class="pagination">';

        $stmtPD = $con->prepare("SELECT * FROM cliente");
        $stmtPD->execute();
        $stmtPD->store_result();

        $BD_records = $stmtPD->num_rows;
        $stmtPD->close();
        $con->close();

        $total_page = ceil($BD_records / $records_by_page);
        $prev = $page - 1;
        $next = $page + 1;

        if ($prev > 0) {
            $strs .= "<li><a data-target='" . $pagination_page . "?page=1'><i class='icon-angle-double-arrow'></i></a></li>";
            $strs .= "<li><a data-target='" . $pagination_page . "?page=$prev'><i class='icon-angle-left'></i></a></li>";
        }

        for ($i = 1;$i <= $total_page;$i++) {
            if ($page == $i) {
                $strs .= "<li><a class='page-link active' >" . $page . "</a></li>";
            } else {
                $strs .= "<li><a class='page-link' data-target='" . $pagination_page . "?page=$i'>$i</a></li>";
            }
        }

        if ($page < $total_page) {
            $strs .= "<li><a class='page-link' data-target='" . $pagination_page . "?page=$next'><i class='icon-angle-right'></i></a></li>";
            $strs .= "<li><a class='page-link' data-target='" . $pagination_page . "?page=$total_page'><i class='icon-angle-double-right'></i></a></li>";
        }

        $strs .= '</ul></div>';

        echo $strs;
        
        else:
            $stmtPD->close();
            echo "no records..";
    endif;
?>

我的表格数据示例:

idCliente    nomCliente    typeCliente    dateCliente
    1          Google         VIP        2021-03-30 22:00:58.277400
    2      StackOverflow      PRIME      2021-03-30 21:00:58.277400

【问题讨论】:

  • 如果仍然将 PHP 变量直接注入 SQL,为什么还要使用准备好的语句? $localization_sql, $records_by_page需要参数化
  • @Dharman 那应该怎么样?因为这个变量告诉查询结果显示在 LIMIT 中,在 ajax 发送的信息之后。
  • 使用占位符,然后使用bind_param()绑定参数
  • @Dharman 我将在使用它时对其进行调查,事实是我仅在查询中使用它(在哪里和)时才实现它
  • 我们看看生成的SQL。

标签: javascript php mysql ajax


【解决方案1】:

我猜pagination.php 有代码连接到数据库,构造一个SELECT 语句来获取所需的行,然后将它们传递回前端?

我看到了?page=&lt;&lt;number&gt;&gt;,但(还)没有关于页面大小,也没有关于过滤。

建议在 JS 中构建这个并发送:

pagination.php?page=3&page_size=25&color=green&size=big

然后,在 PHP 内部,使用 $_GET 查看发送了哪些参数,并对传递的任何参数做出反应(以及 ! empty())。

然后构造所需的查询,例如:

SELECT ...
    FROM ...
    WHERE color = 'green'
      AND size = 'big'
    ORDER BY ...
    LIMIT 50, 25

执行那个;得到结果; json_encode()他们;并响应 AJAX 查询。

然后,在 JS 内部,您需要一个回调来接收该结果并将其呈现给用户。

使用 XHR 而不是 AJAX 可能会更好,因为您实际上并不需要 AJAX 的“异步”部分。

【讨论】:

  • 很容易测试代码,这是HTML和jQuery的基本结构:jsfiddle.net/v4mhp17x你只需要连接我的PHP代码中的任何数据表,文件必须名为pagination.php或其他名称,但记得在 jQuery javascript 代码中更改它。而且它可以毫无问题地工作,因此您可以更多地分析它是如何工作的。
  • @ 你给了我一个例子:pagination.php?page=3&amp;page_size=25&amp;color=green&amp;size=big 但是我如何通过 jQuery javascript 代码发送这些信息?也就是说,如何将要发送的信息放在一起或组合起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多