Сортировка таблицы по заголовку кликаем по нумерации страниц с использованием PHP - PullRequest
0 голосов
/ 17 мая 2018

когда я нажимал на ссылку с книгами, он упорядочивал книги по возрастанию, и если я нажимал снова по ссылке, это упорядочивал книги по убыванию ,,,, моя проблема в том, что когда я нажимал на ссылку с книгами, он заказывал две книги, которыеМне кажется, я хочу, чтобы он заказывал книги, даже если книга находится на следующей странице.

эта функция позволяет книгам отображать ее в таблице

   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>

1 Ответ

0 голосов
/ 17 мая 2018

Похоже, вы выполняете нумерацию страниц на стороне php, а не на стороне javascript.Это означает, что вы должны аналогичным образом упорядочить столбцы на стороне php - нажатие на заголовок должно вызвать новый вызов getBooks с другим предложением ORDER BY.

Так что функция 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, ограничивая количество книг на странице, но позволяя вам получить доступ к другим книгам, потому что у вас естьвсе данные в руки.Это означало бы не использовать «LIMIT» в запросе SQL, потому что вы отправляете все.Это имеет то преимущество, что ограничивает количество обращений к серверу (если это проблема), но может означать, что при обработке большого количества данных на клиентской стороне будет много проблем.

В качестве альтернативы, нумерация страниц выполняетсясторона 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-таблицей.Первый лучше всего подходит для больших проектов, но второй может быть быстрее.Как только сервер отправит обратно данные, вы отобразите их (либо путем создания таблицы в Javascript из объекта JSON, либо путем простой вставки HTML-кода, если вы этого добились).

Извините, если этовозможно, большая работа, чем вы изначально планировали.

...