Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Siadła paginacja, po małej zmianie już nie stronicuje
Pcbecaw
post 13.06.2011, 15:37:38
Post #1





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
thek
post 13.06.2011, 16:06:11
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Pcbecaw
post 13.06.2011, 16:09:44
Post #3





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


A jest jakaś lepsza metoda na połączenie kilku tabel w from i wpisanie do tego funkcji?
Go to the top of the page
+Quote Post
thek
post 13.06.2011, 16:35:54
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Pcbecaw
post 13.06.2011, 19:25:21
Post #5





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


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


Ten post edytował Pcbecaw 13.06.2011, 17:06:59
Go to the top of the page
+Quote Post
uupah5
post 13.06.2011, 19:35:11
Post #6





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post
Pcbecaw
post 13.06.2011, 20:18:30
Post #7





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
thek
post 13.06.2011, 22:40:34
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Pcbecaw
post 13.06.2011, 22:44:47
Post #9





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


Poprzerabiałem WSZYSTKO na jedną tabele. Ostatnie pytanie mam właśnie co do tego linku. Czy taka jego forma jest poprawna?
Go to the top of the page
+Quote Post
thek
post 13.06.2011, 23:03:26
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




%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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Pcbecaw
post 13.06.2011, 23:05:01
Post #11





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


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ść?
Go to the top of the page
+Quote Post
thek
post 13.06.2011, 23:10:59
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zmienić formę wyświetlania? wink.gif
  1. $pagination.= '<a href="'.$targetpage.'page='.$prev.'">Ť Poprzednia</a>';


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Pcbecaw
post 14.06.2011, 09:29:38
Post #13





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


Teraz już wszystko wyjaśnione, dzięki za pomoc specool.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:03