当我单击书籍链接时,它按升序排列书籍,如果我再次单击该链接,它将按降序排列书,……,我的问题是当我单击书籍链接时,他订购了两本对我来说很明显的书,,即使书在下一页中,我也希望他订购这些书。

此功能使书籍在表格中显示

   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>

最佳答案

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

因此sortTable()函数应该是对服务器的ajax调用,在该服务器上,将再次执行“ getBooks”,并按单击哪个标头(以及顺序是升序还是降序)所指定的ORDER BY。如果用户单击“ Books”标题,则查询如下:

$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请求转到php页面,该页面执行sql查询并返回数据。数据可以是一个对象(很可能是JSON),也可以是表的HTML。前者最适合大型项目,但后者可能更快。服务器发送回数据后,您将显示它(通过JSON对象以Javascript生成表,或者如果需要的话,只需插入HTML)。

抱歉,如果这可能比您原先计划的工作还要大。

10-07 13:32
查看更多