当我单击书籍链接时,它按升序排列书籍,如果我再次单击该链接,它将按降序排列书,……,我的问题是当我单击书籍链接时,他订购了两本对我来说很明显的书,,即使书在下一页中,我也希望他订购这些书。
此功能使书籍在表格中显示
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)。
抱歉,如果这可能比您原先计划的工作还要大。