Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Siadła paginacja
Forum PHP.pl > Forum > PHP
Pcbecaw
  1. <?php
  2. /*
  3. Place code to connect to your DB here.
  4. */
  5.  
  6. $dbhost = "localhost";
  7. $dbuser = "root";
  8. $dbpass = "";
  9. $dbname = "smf";
  10.  
  11. $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database");
  12. mysql_select_db($dbname);
  13. $sql = "SET CHARSET utf8";
  14. // include your code to connect to DB.
  15.  
  16. // How many adjacent pages should be shown on each side?
  17. $adjacents = 3;
  18.  
  19. /*
  20. First get total number of rows in data table.
  21. If you have a WHERE clause in your query, make sure you mirror it here.
  22. */
  23. $query = 'SELECT COUNT(*) as num FROM hipnoza WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  24. UNION
  25. select COUNT(*) as num FROM newsy WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  26. UNION
  27. select COUNT(*) as num FROM newsy2 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  28. UNION
  29. select COUNT(*) as num FROM newsy3 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  30. UNION
  31. select COUNT(*) as num FROM newsy4 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  32. UNION
  33. select COUNT(*) as num FROM newsy5 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"';
  34. $total_pages = mysql_fetch_array(mysql_query($query));
  35. $total_pages = $total_pages['num'];
  36. error_reporting(E_ALL ^ E_NOTICE);
  37. /* Setup vars for query. */
  38. $targetpage = "temat.php"; //your file name (the name of this file)
  39. $limit = 10; //how many items to show per page
  40. $page = $_GET['page'];
  41. if($page)
  42. $start = ($page - 1) * $limit; //first item to display on this page
  43. else
  44. $start = 0; //if no page var is given, set start to 0
  45.  
  46. /* Get data. */
  47. $sql= 'select * FROM hipnoza WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  48. UNION
  49. select * FROM newsy WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  50. UNION
  51. select * FROM newsy2 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  52. UNION
  53. select * FROM newsy3 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  54. UNION
  55. select * FROM newsy4 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  56. UNION
  57. select * FROM newsy5 WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"';
  58. $result = mysql_query($sql);
  59. /* Setup page vars for display. */
  60. if ($page == 0) $page = 1; //if no page var is given, default to 1.
  61. $prev = $page - 1; //previous page is page - 1
  62. $next = $page + 1; //next page is page + 1
  63. $lastpage = ceil($total_pages/$limit); //lastpage is = total pages / items per page, rounded up.
  64. $lpm1 = $lastpage - 1; //last page minus 1
  65.  
  66. /*
  67. Now we apply our rules and draw the pagination object.
  68. We're actually saving the code to a variable in case we want to draw it more than once.
  69. */
  70. $pagination = "";
  71. if($lastpage > 1)
  72. {
  73. $pagination .= "<div class=\"strony\">";
  74. //previous button
  75. if ($page > 1)
  76. $pagination.= "<a href=\"$targetpage?page=$prev\">Ť Poprzednia</a>";
  77. else
  78. $pagination.= "<ul>";
  79.  
  80. //pages
  81. if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
  82. {
  83. for ($counter = 1; $counter <= $lastpage; $counter++)
  84. {
  85. if ($counter == $page)
  86. $pagination.= "<li class=\"current\">$counter</li>";
  87. else
  88. $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";
  89. }
  90. }
  91. elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some
  92. {
  93. //close to beginning; only hide later pages
  94. if($page < 1 + ($adjacents * 2))
  95. {
  96. for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
  97. {
  98. if ($counter == $page)
  99. $pagination.= "<li class=\"current\">$counter</li>";
  100. else
  101. $pagination.= "<li><a href=\"$targetpage?page=$counter\">$counter</a></li>";
  102. }
  103. $pagination.= "<li class=\"disabled\">...</li>";
  104. $pagination.= "<li><a href=\"$targetpage?page=$lpm1\">$lpm1</a></li>";
  105. $pagination.= "<li><a href=\"$targetpage?page=$lastpage\">$lastpage</a></li>";
  106. }
  107. //in middle; hide some front and some back
  108. elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
  109. {
  110. $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
  111. $pagination.= "<a href=\"$targetpage?page=2\">2</a>";
  112. $pagination.= "<li class=\"disabled\">...</li>";
  113. for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
  114. {
  115. if ($counter == $page)
  116. $pagination.= "<li class=\"current\">$counter</li>";
  117. else
  118. $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";
  119. }
  120. $pagination.= "<li class=\"disabled\">...</li>";
  121. $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>";
  122. $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";
  123. }
  124. //close to end; only hide early pages
  125. else
  126. {
  127. $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
  128. $pagination.= "<a href=\"$targetpage?page=2\">2</a>";
  129. $pagination.= "<li class=\"disabled\">...</li>";
  130. for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
  131. {
  132. if ($counter == $page)
  133. $pagination.= "<li class=\"current\">$counter</li>";
  134. else
  135. $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";
  136. }
  137. }
  138. }
  139.  
  140. //next button
  141. if ($page < $counter - 1)
  142. $pagination.= "<li><a href=\"$targetpage?page=$next\">Następna ť</a></li></ul>";
  143. else
  144. $pagination.= "";
  145. $pagination.= "</div>\n";
  146. }mysql_close($conn) ;
  147. ?>

i wyświetlanie:
  1. <?php
  2. while($row = mysql_fetch_array($result))
  3. {
  4.  
  5. echo '<div class="c">
  6. <div class="o"><p>';
  7. echo $row[1].'';
  8. echo '</p>
  9. <div class="k"><h1>';
  10. echo $row[2].'';
  11. echo '</h1><p>';
  12. echo $row[3].'';
  13. echo '</p></div>
  14. </div>';
  15. echo $row[4].'';
  16. echo '</div>';
  17. }
  18. ?>
  19. <?=$pagination?>

Gdy SELECT robię takie proste, jednoliniowe, to paginacja działa. Teraz coś się zepsuło i nie działa. Gdzie może tkwić błąd?

Znalazłem błąd:
trzeba to dodać po from w każdym zapytaniu, tylko, że nie wiem jak:
  1. LIMIT $start, $limit

Chodzi o to, że nie wiem jak dodać tą funkcję, żeby była to funkcja, a nie zwykły tekst.
thek
Ech... Ty lepiej popatrz jak zliczasz liczbę wyników to raz. Dwa, że przy użyciu UNION zmienia się nieco zachowanie LIMIT i działa ono już dla listy wyników z WSZYSTKICH podzapytań. Dla MySQL istnieje niejawne obejście tego poprzez ujęcie każdego podzapytania w nawiasy okrągłe, ale wtedy są problemy z sumaryczną liczbą rekordów takiego zapytania.
Pcbecaw
A jest jakaś lepsza metoda na połączenie kilku tabel w from i wpisanie do tego funkcji?
thek
Ja to bym zaczął od końca, a więc nie jak połączyć już istniejące, ale jak podzielić za duże, aby można działać szybciej (partycjonowanie poziome i pionowe), bo da się tu ogromnie na wydajności zyskać. Poza tym jak tak patrzę na Twoje zapytanie i tabele newsy1, newsy2, newsy3 to mam dziwne wrażenie, że masz skopaną lekko bazę, skoro masz tabele z taką samą strukturą, ale rozbite na kilka niezależnych tabel.
Pcbecaw
Zatem jak pogrupować tego bydlaka?
Co do bazy, to nie jest ona skopana, tak tylko wpisałem byle jaką treść tych tabel.
\\//
Jeszcze nie skracając bydlaka, doszedłem do czegoś takiego:
http://wklej.org/id/545922/
i wyświetlają się błędy:
  1. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 24
  2.  
  3. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 24
  4.  
  5. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 25
  6.  
  7. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 25
  8.  
  9. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 26
  10.  
  11. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 26
  12.  
  13. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 27
  14.  
  15. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 27
  16.  
  17. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 28
  18.  
  19. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 28
  20.  
  21. Notice: Undefined variable: start in C:\xampp\htdocs\temat.php on line 29
  22.  
  23. Notice: Undefined variable: limit in C:\xampp\htdocs\temat.php on line 29
  24.  
  25. Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\temat.php on line 30

Jak to naprawić?

Żeby skrocić tabele, wpadłem na pomysł (nie wiem czy dobry czy zły), żeby przypisać tabele do zmiennej, czyli:
  1. $tbl_name="hipnoza, newsy, newsy2, newsy3, newsy4, newsy5";

a potem tylko
  1. $sql= "SELECT * FROM $tbl_name LIMIT $start, $limit";

Tylko jak chcę do tego dodać warunek "where", to nie działa. Jakby to naprawić?

  1. $sql= "SELECT * FROM $tbl_name WHERE keywords='jeden' LIMIT $start, $limit";

Czy to jest złe zapytanie? Wyświetla mi błąd:
Cytat
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\temat.php on line 172
uupah5
Cytat(Pcbecaw @ 13.06.2011, 17:09:44 ) *
A jest jakaś lepsza metoda na połączenie kilku tabel w from i wpisanie do tego funkcji?

http://dev.mysql.com/doc/refman/5.0/en/create-view.html


Pcbecaw
Nie wiem czy dobrze się do tego zastosowałem, ale wydrukowałem coś takiego:
  1. $sql="CREATE VIEW tagi
  2. AS SELECT *
  3. FROM $tbl_name
  4. WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"
  5. LIMIT $start, $limit";

i $tbl_name zawiera kilka tabel.
Po zastosowaniu tego kodu wyświetla się błąd:
  1. Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\xampp\htdocs\temat.php on line 41

41 to:
  1. WHERE keywords="'.htmlspecialchars(addslashes(trim($_GET['t']))).'"


EDIT:
Zrobiłem, tylko mam problem. Jak powinien wyglądać link na drugiej podstronie po identyfikacji?
index.php?haslo=jedenpage=2
teraz jest mniej wiecej tak i nie działa
jak to połączyć?

Ok mam (magiczne &)

Czy taki link jest poprawny?:
http://127.0.0.1/w.php?t=jeden&%20page=1
thek
Lepiej poczytaj wpierw CO to jest perspektywa/widok w bazie zanim zaczniesz tworzyć abstrakcyjne zapytania wink.gif Bo perspektywa to taka fikcyjna tabela. Tworzysz ją RAZ jako zapytanie i wisi sobie to zapytanie w bazie, choć fizycznie NIE tworzysz nowych tabel. Ale od strony użytkownika wygląda to jak tabela i możesz do niej zapytania wysyłać, traktujac jakby była zwykła tabelą.
Pcbecaw
Poprzerabiałem WSZYSTKO na jedną tabele. Ostatnie pytanie mam właśnie co do tego linku. Czy taka jego forma jest poprawna?
thek
%20 to spacja... Usunąłbym ją z linka bo różnie przeglądarki mogą na nią reagować. Niby powinny ją zrozumieć, ale w praktyce bywa różnie.

Aha... Nie szalej z jedną tabelą na wszystko bo możesz sobie bardziej zaszkodzić. Bazę projektuje się z głową i myśli zawczasu o możliwych problemach w przyszłości oraz pod tym kątem ją optymalizuje.
Pcbecaw
Co do usunięcia tej spacji, to nie wiem jak to zrobić, bo:
  1. $pagination.= "<a href=\"$targetpage page=$prev\">Ť Poprzednia</a>";

to jest kawałek kodu dot. wyświetlania. Jest tam spacja przed page, jednak gdy usunę tą spacje, to złączy się to ze zmienną. Jak to można obejść?
thek
Zmienić formę wyświetlania? wink.gif
  1. $pagination.= '<a href="'.$targetpage.'page='.$prev.'">Ť Poprzednia</a>';
Pcbecaw
Teraz już wszystko wyjaśnione, dzięki za pomoc specool.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.