【问题标题】:Table sort on header click in the pagination using PHP使用PHP在分页中单击标题对表格进行排序
【发布时间】:2018-10-27 14:02:20
【问题描述】:

当我点击书籍链接时,它会按升序排列书籍,如果我再次点击链接,它将按降序排列书籍,,,, 我的问题是当我点击书籍链接时,他订购了两本书在我看来,我希望他订购书,即使书在下一页。

这个函数来获取书籍并在表格中显示它

   public function getBooks($start = 0, $limit = 2)
{
   $sql_start = $start * $limit;
   $sql_limit = $limit;

   $query = "SELECT Library.nameOfBook, userBook.book_id, userBook.user_id FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username=:username LIMIT $sql_start, $sql_limit";
   $statment = $this->db->prepare($query);
   $statment->execute([
       ':username' => $this->username
   ]);
   $result = $statment->fetchAll();

  echo "<table id='myTable' border='1'>

  <tr>
   <th><a onclick='sortTable(1)' href='#'>Books</a></th>
   <th>Action</th>
   </tr>";
   foreach($result as $row){
       echo "<tr>";
       echo "<td>" . $row['nameOfBook'] . "</td>";
       echo "<td>" ."<input type='submit' id='delete".$row['book_id']."-".$row['user_id']."' onclick='deleteBook(this)' name='delete' value='Delete'>" . "</td>";
       echo "</tr>";
   }

   echo "</table>";
   echo "";

 }

和这个 JavaScript 函数来升序降行

<script>
function sortTable(n) {
  var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
  table = document.getElementById("myTable");
  switching = true;
  dir = "asc";
  while (switching) {
    switching = false;
    rows = table.getElementsByTagName("TR");
    for (i = 1; i < (rows.length - 1); i++) {
      shouldSwitch = false;
      x = rows[i].getElementsByTagName("TD")[n];
      y = rows[i + 1].getElementsByTagName("TD")[n];
      if (dir == "asc") {
        if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
          shouldSwitch= true;
          break;
        }
      } else if (dir == "desc") {
        if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
          shouldSwitch = true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      switchcount ++;     
    } else {
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}
</script>

【问题讨论】:

    标签: javascript php pdo pagination


    【解决方案1】:

    您似乎是在 php 端而不是 javascript 端执行分页。这意味着您应该类似地在 php 端进行列排序 - 单击标题应该会导致使用不同的“ORDER BY”子句重新调用“getBooks”。

    所以 sortTable() 函数应该是对服务器的 ajax 调用,其中再次执行“getBooks”,其中 ORDER BY 由单击哪个标题(以及顺序是升序还是降序)指示。如果用户单击“书籍”标题,则查询如下所示:

    $query = "SELECT Library.nameOfBook, userBook.book_id, userBook.user_id FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username=:username LIMIT $sql_start, $sql_limit ORDER BY nameOfBook " //add DESC if necessary
    

    编辑:

    快速解释:

    当对表格进行分页时,您可以在客户端(在本例中为 javascript)或服务器端(在本例中为 php)进行。

    在客户端做事意味着您从服务器获取所有数据(因此图书馆中的所有书籍),可能是 JSON 对象(可能是 XML 或其他东西),然后您从该数据生成表在 Javascript 中,限制每页的书籍数量,但允许您访问其他书籍,因为您手头有所有数据。这意味着不在 SQL 查询中使用“LIMIT”,因为您正在发送所有内容。这具有限制对服务器的调用的优势(如果这是一个问题),但如果您有大量数据,则可能意味着在客户端进行大量数字运算。

    或者,您可以在 php 端完成分页。在这种情况下,查询将包含 LIMIT 以保持数据较小,但您可能还希望向客户端发送完整的条目数,以便可以计算页数(这可以使用 SQL_CALC_FOUND_ROWS 完成)。您可以从 javascript 向服务器发送 AJAX 请求以获取数据。以下是一些资源:

    AJAX: https://www.w3schools.com/xml/ajax_intro.asp

    https://www.tutorialspoint.com/ajax/index.htm

    SQL_CALC_FOUND_ROWS: https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

    JSON 格式: https://www.w3schools.com/js/js_json_intro.asp

    ajax 请求转到执行 sql 查询并返回数据的 php 页面。数据可以是一个对象(最有可能是 JSON)或直接是表格的 HTML。前者最适合大型项目,但第二个可能更快。一旦服务器发回数据,您将显示它(通过从 JSON 对象以 Javascript 生成表,或者如果您想要的话,只需插入 HTML)。

    抱歉,这可能比您最初计划的工作要大。

    【讨论】:

    • 那么我应该使用ajax来做这个过程吗?
    • 是的,恐怕是的。所以你不应该让 php 文件回显表,而是让 div 包含表,向 php 文件发送 ajax 请求,然后返回表 html,然后 javascript 用 html 填充 div php已经生成。希望这是有道理的
    • 请先生您能给我更多的细节吗,我是新的自学者,我今天必须完成这项任务@Michael Beeson
    • 用可能有帮助的教程链接完成了一个大的编辑。
    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2013-04-22
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多