使用php和ajax增加给定数量的查询限制

时间:2017-12-13 01:56:31

标签: php jquery ajax

对新信息重新提出问题
我试图在搜索上显示一组有限的结果(即查询中的LIMIT 10)然后有一个按钮将加载下一个10(现在在同一查询中为LIMIT 20)。

问题在于,当我按下按钮时,它不仅刷新指定的div - 而是重新运行页面顶部的doSearch - 从而将LIMIT重置为10 ...

所以,如果我 1.加载结果页面
2.在页面顶部注释掉doSearch 然后...... 3.单击按钮

它的工作方式已经过了......它现在显示了20个结果......如果我再次点击它会显示30个......等等。

如果我在页面顶部取消注释doSearch并点击按钮......它现在再次显示10个结果......

ajax代码中的代码是

var showResult = self.closest('#showResultsAll').find('[id^="showResults"]');
showResult.load(location.href + " #showResults>*", "");

我无法理解为什么我的代码会在页面顶部重新运行doSearch ...但是你们中的一些聪明的人可以看到我的方式错误并让我走上正确的道路... < / p>

我的基本设置:
结果页:

<?php // get search results limit 10 ?>
.
.
.
<div id="showResultsAll">
    .
    .
    .
    <div id="showResults">
        // Loop through and show results
        <div id="moreResultsButton">
            <input type="hidden" name="search" id="search" value="<?php // search terms ?>">
            <button id="moreResults" value="<?php // number of results found ?>">

的jquery.js

$(document).ready(function(){
    "use strict";
    $(document).on('click','button[id^="moreResults"]', function(){
        var self = $(this);
        var closestDiv = self.closest('#moreResultsButton');
        var search = closestDiv.find('[id^="search"]').val();
        var count = self.val();
        var countNew = + count + 10;
        $.ajax({
            type: "POST",
            url:'../scripts/moreresults.php',
            data:"countNew="+countNew+"&search="+search,
            success:function(){
                var showResult = self.closest('#showResultsAll').find('[id^="showResults"]');
                showResult.load(location.href + " #showResults>*", "");
            }
        });
    });
});

moreresults.php

session_start ();

require ( "../scripts/functions.php" );

// Set variable
$search = $_POST['search'];
$limit = $_POST['countNew'];

doSearch ( $pdo , $search , $limit ); // same function that found the search results in the first place

更新
因此,基于@delCano下面给出的答案松散地找到了一个解决方案(虽然我仍然很好奇为什么我的原始代码坚持重新运行页面顶部的doSearch)

解决方案:
我首先删除了doSearch中的限制,然后让它找到所有结果,然后在页面的show-results部分中执行'限制',然后在我的jQuery中添加10,

新代码:
带结果的页面

<?php // doSearch no limit ?>
.
.
.
<div id="showResultsAll">
    .
    .
    .
    <div id="showResults">
        // Loop through and show results - limiting like this
        // if isset $_POST['show'] (ie. button clicked)
            // if $_POST['show'] less than $_SESSION['totalResults'] (ie. more results coming)
                // $show = $_POST['show'] (ie. 20, 30, etc.)
            // else
                // $show = $_SESSION['totalResults'] (ie. 11, 12, ..., 21, 22, ..., 31, 32, ..., etc.)
        // else (if button not clicked limit results to max. 10) 
            // if $_SESSION['totalResults'] more than 10
                // $show = 10 
            // else
                // $show = $_SESSION['totalResults'] (ie. 1, 2, 3, etc.)
        // loop trough $show number of results

        <div class="<?php if $show == $_SESSION['totalResults'] echo "disabled" // Only active if more results are available ?>" id="moreResultsButton">
            <button id="moreResults" value="<?php echo $show; ?>">

的jquery.js

$(document).ready(function(){
    "use strict";
    $(document).on('click','button[id^="moreResults"]', function(){
        var self = $(this);
        var show = self.val();
        var showNew = + show + 10;
        $.ajax({
            type: "POST",
            url:'',
            data:"show="+showNew,
            success:function(){
                self.closest('#showResultsAll').find('[id^="showResults"]').load(location.href + " #showResults>*", "");
            }
        });
    });
});

1 个答案:

答案 0 :(得分:1)

好的,这不是最好的答案,只是上述评论的一个发展。我明天会试着写一个更好的答案。

但是,目前我的快速解决方法是:

  1. 如您所述,从页面顶部删除doSearch,并将所有初始数字设置为0.
  2. 用这个替换你的jQuery:
  3. $(document).ready(function(){
        "use strict";
        $('button#moreResults').click(addResults);
    
        function addResults(){
            var self = $(this);
            var closestDiv = self.closest('#moreResultsButton');
            var search = closestDiv.find('[id^="search"]').val();
            var count = self.val();
            var countNew = + count + 10;
            $.ajax({
                type: "POST",
                url:'../scripts/moreresults.php',
                data:"countNew="+countNew+"&search="+search,
                success:function(){
                    var showResult = self.closest('#showResultsAll').find('[id^="showResults"]');
                    showResult.load(location.href + " #showResults>*", "");
                }
            });
        }
        
        // load the first ten results
        addResults();
    });

    请注意我对您的Javascript进行了微小的更改。这不一定是最佳方式;我明天会修改并编辑它。

    编辑:主要重构

    1. doSearch是一个PHP函数,可将搜索结果打印到屏幕上。我会将其更改为一个返回结果数组的函数。我没有你的代码,我不知道它的外观,但它应该返回类似于: 阵列(   array('name'=&gt;'One','surname'=&gt;'Smith'),   array('name'=&gt;'Two','surname'=&gt;'Smythe'),   .... )
    2. moreresults.php是调用加载新结果的PHP。由于所有其余逻辑都将在Javascript中完成,因此现在只需要我们调用的PHP代码。我现在将在此文件中包含doSearch()。

      session_start();

      require(“../ scripts / functions.php”);

      function doSearch($ pdo,$ search,$ limit){   / *在这里做逻辑* /   return $ array_of_results; }

      //设置变量 $ search = $ _POST ['search']; $ limit = $ _POST ['countNew'];

      $ results = doSearch($ pdo,$ search,$ limit);

      header('Content-Type:application / json'); //这将告诉客户端返回的内容类型。 echo json_encode($ results); //使用JSON在服务器端代码(PHP)和前端代码(Javascript)之间进行所有数据传输是个好主意。最好永远不要在PHP代码中输出任何内容,直到最后,您拥有所有必需的数据。它使以后更容易调试。

    3. 现在,HTML。它现在不需要任何PHP预处理,因为它总是会启动相同的。我们也不需要在这里跟踪变量,因为现在所有的逻辑都在Javascript部分。

    4. .
      .
      .
      <div id="showResultsAll">
          .
          .
          .
          <ul id="showResults">
          </ul>
          <button id="loadMore">Load more results</button>
      </div>
      .
      .
      .

      1. Javascript现在承担了大部分逻辑的重要性。
      2. $(function() { // Shorthand for "$(document).ready(function()..."
            var count = 0;
            $("#loadMore").click(loadMoreResults);
            
            function loadMoreResults() {
               var url = "../scripts/moreresults.php";
               var search = $("#search").val();
               count += 10;
               var data = {
                  'countNew': count,
                  'search': search
               };
               $.post(url, data, showResults, 'json' );
            }
            
            function showResults(data) {
                $("#showResults").empty().append(`
                <li>${data.name} ${data.surname}</li>
                `);
            }
        });

        注意:

        • 由于我不知道您使用的是哪种数据,我使用名单和姓氏列表作为示例。
        • 同样,我将结果显示为无序列表()和列表项(
        • );你可能更喜欢桌子或其他不同的东西。
        • 代码完全未经测试。我试着小心,但我可能犯了一些拼写错误或其他错误。
        • 如果我是你,我会尝试在开始使用Ajax之前先学习一些jQuery基础知识。 FreeCodeCamp有一个很好的jQuery课程。
        • 代码架构非常重要,在在线课程中通常没有很好地解释。总结:

          1. 始终提前计划您的代码。拿起笔和纸,或者你喜欢的文本编辑器,然后回答问题:“代码必须做什么?”。然后以较小的步骤分解答案。然后将每个步骤分成更小的步骤,依此类推。
          2. 每当你有一段代码时,你可能需要两次,将它包装成一个函数。将功能视为小“任务”
          3. 尽可能地将演示中的逻辑分开。您应该让部分代码处理数据本身,并且部分代码处理数据显示,并且它们应该几乎彼此独立。您可能想要查看MVC模式(模型 - 视图 - 控制器);它可能正在取代,但它是一个很好的起点。顺便说一句,这在后端是有效的(doSearch将是逻辑,更多是演示文稿)和前端(html是演示文稿,javascript是逻辑)。
        • 要完成,我给你的代码并不完美,但我认为这是一个更好的开始。您肯定会找到很多方法来改进它