Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [1][2][3][4][5]... itd. strony.
Forum PHP.pl > Forum > PHP
waqmaz
Cześć. Nie mam pojęcia jak to zrobić, a siedzę przy tym już od 15:00 =/ Algorytmów już wymyślać też próbowałem masę, ale na nic.
Np. jednym z nich miało być:
zalóżmy ze jest strona [2] wtedy
maximum=9*numerstrony= 18
minimum=maximum-9=9
for (i=minimum;i=maximum;i++)
tutaj daje funkcje która wyświetla ci przedmiot i jako argument podajesz zmienna i)


Chodzi o to, że mam skrypt wyświetlający ilość przedmiotów na stronie.
Maksymalnie na 1 stronie może mieścić się 9 przedmiotów (dodam jeszcze, że są pobierane z bazy), i kiedy umieścimy 10 przedmiot, to powinien znajdować się na kolejnej stronie. Powinniśmy widzieć przedmiot z numerem 10, ale tlyko ten 1 przedmiot, bez reszty 9, które są na stronie jeden. I tak samo za każdym razem, aby osiągnąć efekt podobny do tego:

Pierwsza strona, 1,2,3,4,5... 100,101,102, Ostatnia strona.

Użyłem czegoś takiego.
  1. if($i<=9){
  2. $ilosc_stron=1;
  3. echo '<a href="index.php?action=kategorie/przedmioty">'. "Str:" . $ilosc_stron . ' ' . '</a>';
  4. }
  5. elseif($i>9 && $i<=18){
  6. echo '<a href="index.php?action=kategorie/przedmioty">'. "Str:" . $ilosc_stron++. ' ' . '</a>';
  7. }


Jednak nawet to nie działa, poza tym jest niedokończone, gdyż i tak by nie wyświetlało na kolejnych stronach przedmiotów, które są zmienną $i.
Pokaże może kawałek kodu:
  1. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  2.  
  3. for ($i=0; $i <$ile; $i++) {
  4.  
  5. $wiersz = $wynik->fetch_assoc();
  6.  
  7. echo '<center><div class="rwo">';
  8. echo "<p><b>".($i+1).". Tytuł: ";
  9. echo ($wiersz['tytul']);
  10. echo "</b></p>";
  11. echo "</div></center>";
  12. }
  13.  
  14. //tutaj powinien zostac umieszczony kod ze stronami typu [1],[2],[3] itd...
  15.  
  16. $wynik->free();
  17. $db->close();
  18.  
  19. ?>


Wie ktoś jak zrobić, aby przedmioty $i były wyświetlane odpowiednio na każdej stronie po 9 sztuk?
Powiedzmy, że dodaje w bazie 22 przedmioty.
na stronie pierwszej powinno znajdować się 9, na drugiej 9, i na trzeciej 4.

Nie mogę wymyślić, to jest zbyt dla mnie skomplikowane. Przeglądałem angielskie fora, jednak tam też sporo rzeczy nie potrafię zrozumieć.
Będę bardzo wdzięczny.
Spawnm
Poczytaj o paginacji
aeaeae
Po pierwsze masz dwie dane: 1 - ilość przedmiotów w ogóle, i 2 - ile przedmiotów wyświetlać na jednej stronie. Nazwę je $ile_ogolnie i $ile_na_stronie (> 0). Teraz musisz wygenerować ilość stron: $ilosc_stron (te Twoje[1][2] ...) - trzeba tu zadbać o to co się stanie jeśli przedmiotów będzie 0, albo gdy zmieszczą się na jednej stronie.
  1.  
  2. $ilosc_stron=(int)(ceil($ile_ogolnie/$ile_na_stronie));

Co tym osiągamy?
Dla 0 przedmiotów w ogóle i np. 4 przedmiotów na stronę mamy $ilosc_stron=0.
Dla 1 przedmiotów w ogóle i 4 przedmiotów na stronę mamy $ilosc_stron=1.
...
Dla 4 przedmiotów w ogóle i 4 przedmiotów na stronę mamy $ilosc_stron=1.
Dla 5 przedmiotów w ogóle i 4 przedmiotów na stronę mamy $ilosc_stron=2.

Teraz wyświetlanie. Masz dany dodatkowo $numer_strony (bo user kliknął na którąś z możliwości [1][2] ...). Najpierw obliczasz $min i $max nie przejmując się ilością przedmiotów (tak jak by ich było nieskończenie dużo).
  1. $min=($numer_strony-1)*$ile_na_stronie+1;
  2. $max=$numer_strony*$ile_na_stronie;

Te obliczenia abstrahują od ilości przedmiotów.
Np. masz 1 przedmiot a wyświetlasz 4 przedmioty na stronę. Chcesz znać $min i $max dla drugiej strony (teoretycznie) bo dla jednego przedmiotu nic nie powinno się wyświetlić na drugiej stronie. Wtedy oczywiście $min=5 a $max=8.

Teraz wyświetlenie.
Mamy dane: $ile_ogolnie, $min, $max (bo obliczyliśmy je dla zadanej strony ...)
  1. $i=$min;
  2. while($i<=$ile_ogolnie && $i<=$max)
  3. {
  4. echo "jestem $i - tym przedmiotem";
  5. $i++;
  6. }


Tutaj while jedzie od $min do $max patrząc jednocześnie czy nie zostanie przekroczona liczba przedmiotów ($ile_ogolnie). W środku while operujesz sobie $i, która to zmienna reprezentuje kolejno numery przedmiotów, które powinny się wyświetlić.

Np. dla
$ile_ogolnie=12
$ile_na_stronie=5
i dla trzeciej strony:
$numer_strony=3
zostaną obliczone
$min=11
$max=15
a zatem while wykona swój blok dwa razy - $i będzie wynosiło kolejno 11 i 12.
===============================
Teraz można to uporządkować w dwa for:
$n - numer strony
$ile - ile na stronie
$o - ilość przedmiotów w ogóle
$is - ilość stron
  1. for($i=($n-1)*$ile+1; ($i<=$n*$ile)&&($i<=$o); $i++)
  2. echo "przedmiot nr $i".'<br />';
  3. $is=(int)(ceil($o/$ile));
  4. if(!$is)
  5. echo 'brak przedmiotow';
  6. else
  7. for($i=1;$i<=$is;$i++)
  8. echo '<a href="index.php?p='.$i.'">['.$i.'] '.'</a>';
waqmaz
Dziękuję ślicznie, naprawdę dobry algorytm. A mam jeszcze jedno pytanie. Czy do tego trzeba już na zapas stworzyć strony np. 200 stron o nazwie powiedzmy index.php1, index.php2, index.php3? Czy może, da się jakoś innym sposobem, lub funkcją $_GET?

Bardzo dobra praca!

Chodzi o to, aby link nie wyglądał tak:
  1. echo '<a href="index.php?action=kategorie/osoby'.$i.'">['.$i.'] '.'</a>';


A tak:

  1. echo '<a href="index.php?action=kategorie/osoby'.'</a>';


Chyba, że tak się nie da, za pomocą akcji. I pewnie musiałbym tworzyć plik za każdym razem, kiedy dodaje się kolejna strona.
aeaeae
Zrób z tego plik index.php i uruchom, to może Ci się wyjaśni ...

  1. <?php
  2. $o=120; //liczba przedmiotow ogolnie
  3. $ile=7; //liczba przedmiotow na strone
  4. $n=$_GET['p']; //pobranie numeru strony
  5. if($n<1) //zabezpieczenie przed pustym i ujemnym p
  6. $n=1;
  7.  
  8. $max=$n*$ile;
  9. for($i=($n-1)*$ile+1; ($i<=$max)&&($i<=$o); $i++)
  10. echo "przedmiot nr $i".'<br />';
  11. $is=(int)(ceil($o/$ile));
  12. if(!$is)
  13. echo 'brak przedmiotow';
  14. else
  15. for($i=1;$i<=$is;$i++)
  16. echo '<a href="index.php?p='.$i.'">['.$i.']'.'</a>'.' ';
  17. ?>
waqmaz
Dzięki wielkie. 'Wyjaśniło mi się'.

PS. Czuję się taki mały, przy kimś, kto napisał coś takiego sad.gif

Pozdrawiam.

Nie chciałbym Cię już obciążać, lecz mam jeszcze jedno pytanie - nie koniecznie do Ciebie, jeżeli już Ci się nie chce.

Fajnie, że pobieram parametr $_GET[p], ale jak pobrać 2 parametry w 1 linku?
Potrzebuję tego dlatego, że skrypt działa tylko w indeks.php, a kiedy chcę umieścić go w folderze kategorie/osoby.php, to muszę pobrać parametr action, który sobie napisałem.

Wygląda to tak, kiedy działa i jest w index.php:

  1. echo '<a href="index.php?p='.$i.'">['.$i.']'.'</a>'.' ';


A tak kiedy nie działa i jest w osoby.php wyświetlane w stronie index.php poprzez parametr action:

  1. echo '<a href="index.php?action=kategorie/osoby='.$i.'">['.$i.']'.'</a>'.' ';


W takim przypadku jak ten w linijce powyżej musiał bym tworzyć osobne pliki, a bym chciał dołączyć to "?p=" do pliku osoby.php, jednak to nie działa (patrz niżej):

  1. echo '<a href="index.php?action=kategorie/osoby?p='.$i.'">['.$i.']'.'</a>'.' ';
, lub to:
  1. echo '<a href="index.php?action=kategorie/osoby.php?p='.$i.'">['.$i.']'.'</a>'.' ';

Jakieś pomysły?
aeaeae
No cóż ... na pewno nie miałbyś z tym aż takich trudności gdybyś pisał w Pascalu czy C++. W php bardzo przeszkadza przekazywanie zmiennej i przygotowanie kodu html przez echo - szczególnie gdy ktoś zaczyna naukę albo po prostu nie czuje tego za dobrze.

edit:
index.php?zmienna1=wartosc1&zmienna2=wartosc2& ...
waqmaz
Dobra, już patrzę.

Masz rację: "bardzo trudno". Dlatego sam tego nie zrobię za chiny. Zielonego pojęcia nie mam jak, a potrzebuję tego ; /. Ehh... mogłem w ogóle nie brać się za programowanie, skoro ze mnie taka ciota. 2 lata w plecy?
Aha, a ten action to u mnie wygląda tak:
  1. <?php if($_GET['action']!=NULL) { require $_GET['action'] . ".php"; } else { require "tekst_kontener_glowny.php"; } ?>
aeaeae
Chodzi o to, że chcesz mieć ten kod, który dałem w innym pliku? Np. osoby.php? Niezależnie od folderu wystarczy, że dasz ten kod do pliku osoby.php i zmienisz tak:

  1. echo '<a href="osoby.php?p='.$i.'">['.$i.']'.'</a>'.' ';


Dodatkowo, jeśli chcesz obsługiwać dodatkowe zmienne GET z tych wygenerowanych linków, to możesz je dopisać w echo:

  1. echo '<a href="osoby.php?p='.$i.'&drugazmienna=wartoscdrugiejzmiennej'.'">['.$i.']'.'</a>'.' ';
waqmaz
Dzięki, już sobie poradziłem smile.gif

Kurde, właśnie odkryłem kolejny problem.

Oto kod:
  1. $ile_znalezionych = $wynik->num_rows;
  2.  
  3. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  4.  
  5.  
  6. $ile_na_stronie=9;
  7. $nr_str=$_GET['numer_strony'];
  8.  
  9. if($nr_str<1) { //zabezpieczenie przed pustymi i ujemnymi numerami_strony
  10. $nr_str=1;
  11. }
  12. $max=$nr_str*$ile_na_stronie;
  13.  
  14. for($i=($nr_str-1)*$ile_na_stronie+1; ($i<=$max)&&($i<=$ile_znalezionych); $i++) {
  15.  
  16. $wiersz = $wynik->fetch_assoc();
  17.  
  18. echo '<center><div class="rwo">';
  19. echo "<p><b>".$i.". Tytuł: ";
  20. echo ($wiersz['tytul']);
  21. echo "</b></p>";
  22. echo "</div></center>";
  23.  
  24. $is=(int)(ceil($ile_znalezionych/$ile_na_stronie));
  25. }
  26. if(!$is) {
  27. echo 'Brak ogloszen z przedmiotami.';
  28. }
  29. else {
  30. for($i=1;$i<=$is;$i++) {
  31. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  32. }
  33. }


Już mówię o co dokładnie chodzi.

Kiedy dodaję do bazy przedmioty np. biurko, kosmita, głośnik to jest dobrze dopóki nie dojdzie do ogłoszenia z numerem 9, gdyż "$ile_na_stronie=9;" jest ustawione na 9.
Wtedy, kiedy dodam ogłoszenie z numerem 10, to kopiuje się nazwa ogłoszenia 9-tego. Jednak 11 ogłoszenie jest już znowu dobrze i tak aż do 18stego i sytuacja znów się powtarza. Nie wiem jak to naprawić =/
WebCM
Źle ci powiedzieli. Pokaż zapytanie do bazy. Nie wyciągaj wszystkich rekordów z tabeli, tylko te, których potrzebujesz. Do tego użyj słowa kluczowego LIMIT. Wtedy pętla będzie bardzo łatwa:
  1. for($i=0; $i<$ile_na_stronie; $i++) {
  2. /* obróbka i wyświetlanie elementów */
  3. }
A tu przykład zapytania z użyciem LIMIT
  1. SELECT * FROM tabela WHERE warunki LIMIT 0,9
Gdzie 0 - indeks początkowego rekordu, 9 - ilość rekordów

Pamiętaj o używaniu mechanizmu podpinania. Jeżeli nie, upewnij się, że przekazujesz do zapytania wartości liczbowe ($_GET['numer_strony'] równie dobrze może być dalszym ciągiem zapytania i to złośliwym). Jak wyciągnąć indeks początkowego rekordu? Można tak:
  1. $st = ($nr_str-1) * $ile_na_stronie; //dla $nr_str > 0
waqmaz
Cały kod wyciągania przedmiotow z bazy wygląda tak =/
  1. @ $db = new mysqli('localhost', 'root', 'jakieshaslo', 'biblioteka');
  2. $zapytanie = "select * from przedmiot";
  3. $wynik = $db->query($zapytanie);
  4.  
  5. $ile_znalezionych = $wynik->num_rows;
  6.  
  7. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  8.  
  9.  
  10. $ile_na_stronie=9;
  11. $nr_str=$_GET['numer_strony'];
  12.  
  13. if($nr_str<1) { //zabezpieczenie przed pustymi i ujemnymi numerami_strony
  14. $nr_str=1;
  15. }
  16. $max=$nr_str*$ile_na_stronie;
  17.  
  18. for($i=($nr_str-1)*$ile_na_stronie+1; ($i<=$max)&&($i<=$ile_znalezionych); $i++) {
  19.  
  20. $wiersz = $wynik->fetch_assoc();
  21.  
  22. echo '<center><div class="rwo">';
  23. echo "<p><b>".$i.". Tytuł: ";
  24. echo ($wiersz['tytul']);
  25. echo "</b></p>";
  26. echo "</div></center>";
  27.  
  28. $is=(int)(ceil($ile_znalezionych/$ile_na_stronie));
  29. }
  30. if(!$is) {
  31. echo 'Brak przedmiotow.';
  32. }
  33. else {
  34. for($i=1;$i<=$is;$i++) {
  35. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  36. }
  37. }
  38.  
  39. $wynik->free();
  40. $db->close();


Ogólnie efekt wygląda tak na stronie nr 1:


A na stronie nr 2 tak:


Zauważymy, że numery są dobrze wyświetlane, a nazwy przedmiotów się kopiują, a w dodatku niektóre znikają - te, które już były wcześniej. A jeszcze nad to, te wszystkie nazwy są wyświetlane nie pokoleii, tylko różnie =/
Nie rozumiem dlaczego.
WebCM
Najlepiej gdzieś zapisać ilość rekordów, aby nie liczyć za każdym razem. Są 2 wyjścia:
1) Pobierać wszystkie rekordy z bazy i wyświetlać tylko pożądane (1 zapytanie)
2) Liczyć ilość rekordów, a następnie pobrać potrzebne, używając słowa LIMIT (2 zapytania)

Ile będziesz miał rekordów w 1 tabeli? W pierwszym przypadku:
  1. @ $db = new mysqli('localhost', 'root', 'jakieshaslo', 'biblioteka');
  2. $wynik = $db->query('SELECT * FROM przedmiot');
  3.  
  4. $ile_na_stronie=9;
  5.  
  6. if(isset($_GET['numer_strony']) && $_GET['numer_strony']>1)
  7. {
  8. $nr_str = (int)$_GET['numer_strony'];
  9. $start = ($nr_str - 1) * $ile_na_stronie;
  10. }
  11. else
  12. {
  13. $nr_str = 1;
  14. $start = 0;
  15. }
  16.  
  17. $ile_znalezionych = $wynik->num_rows;
  18. $wiersze = $wynik->fetch_all(MYSQLI_ASSOC);
  19. $max = $start + $ile_na_stronie;
  20.  
  21. echo '<center><p>Ilość znalezionych pozycji: '.$ile_znalezionych.'</p></center>';
  22.  
  23. for($i=$start; $i<$max && $i<$ile_znalezionych; $i++) {
  24.  
  25. echo '<center><div class="rwo">';
  26. echo '<p><b>'.++$i.'. Tytuł: ';
  27. echo $wiersze[$i]['tytul'];
  28. echo '</b></p>';
  29. echo '</div></center>';
  30. }
  31.  
  32. $is=ceil($ile_znalezionych/$ile_na_stronie);
  33.  
  34. if(!$is) {
  35. echo 'Brak przedmiotow.';
  36. }
  37. else {
  38. for($i=1;$i<=$is;$i++) {
  39. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  40. }
  41. }
  42.  
  43. $wynik->free();
  44. $db->close();
aeaeae
Cytat(WebCM @ 20.05.2011, 23:45:47 ) *
Pamiętaj o używaniu mechanizmu podpinania. Jeżeli nie, upewnij się, że przekazujesz do zapytania wartości liczbowe ($_GET['numer_strony'] równie dobrze może być dalszym ciągiem zapytania i to złośliwym).


To to co napisałem nie wystarczy?
  1. $n=$_GET['p'];
  2. if($n<1)
  3. $n=1;
waqmaz
WebCM - nie działą =/
efekt:




  1. linia 47: $wiersze = $wynik->fetch_all(MYSQLI_ASSOC);


Kiedy zmieniłem kod na:

  1. @ $db = new mysqli('localhost', 'root', '....', 'biblioteka');
  2. $zapytanie = "select * from przedmiot";
  3. $wynik = $db->query($zapytanie);
  4.  
  5. $ile_na_stronie=9;
  6.  
  7. if(isset($_GET['numer_strony']) && $_GET['numer_strony']>1)
  8. {
  9. $nr_str = (int)$_GET['numer_strony'];
  10. $start = ($nr_str - 1) * $ile_na_stronie;
  11. }
  12. else
  13. {
  14. $nr_str = 1;
  15. $start = 0;
  16. }
  17. $ile_znalezionych = $wynik->num_rows;
  18. $wiersz = $wynik->fetch_assoc;
  19.  
  20.  
  21. $max = $start + $ile_na_stronie;
  22.  
  23. echo '<center><p>Ilość znalezionych pozycji: '.$ile_znalezionych.'</p></center>';
  24. for($i=$start; $i<$max && $i<$ile_znalezionych; $i++) {
  25. echo '<center><div class="rwo">';
  26. echo '<p><b>'.++$i.'. Tytuł: ';
  27. echo $wiersz[$i][$tytul];
  28. echo '</b></p>';
  29. echo '</div></center>';
  30. }
  31. $ilosc_stron=ceil($ile_znalezionych/$ile_na_stronie);
  32. if(!$ilosc_stron) {
  33. echo 'Brak przedmiotow.';
  34. }
  35. else {
  36. for($i=1;$i<=$ilosc_stron;$i++) {
  37. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  38. }
  39. }
  40.  
  41. $wynik->free();
  42. $db->close();


efekt jest taki:



Nie wyświetla nazw ['tytul']'u i liczy co 2 =/

Co mam robić? POMOCY =/

dobra, juz wiem ze za co drugie ywyswietlanie ejst odpowiedzialne ++i, ale co z tymi tytulami, dlaczego sie nie pokazuja? =/
radziopoke
Przerobiłem troszkę twój kod:

  1. @ $db = new mysqli('localhost', 'root', 'jakieshaslo', 'biblioteka');
  2. $zapytanie = "select * from przedmiot";
  3. $wynik = $db->query($zapytanie);
  4.  
  5. $ile_znalezionych = $wynik->num_rows;
  6. $wynik->free();
  7.  
  8. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  9.  
  10. $ile_na_stronie=9;
  11. $maxstr=(int)(ceil($ile_znalezionych/$ile_na_stronie));
  12.  
  13. $nr_str=(int)$_GET['numer_strony'];
  14.  
  15. //zabezpieczenie przed pustymi i ujemnymi numerami_strony
  16. if($nr_str<1)
  17. {
  18. $nr_str=1;
  19. }
  20. else if ($nr_str>$maxstr)
  21. {
  22. $nr_str=$maxstr;
  23. }
  24.  
  25. if ($ile_na_stronie>0)
  26. {
  27. $zapytanie = "select * from przedmiot LIMIT ".(($nr_str-1)*9).", ".$ile_znalezionych;
  28. $wynik = $db->query($zapytanie);
  29. $wiersz = $wynik->fetch_assoc();
  30.  
  31. echo '<center><div class="rwo">';
  32. echo "<p><b>".$i.". Tytuł: ";
  33. echo ($wiersz['tytul']);
  34. echo "</b></p>";
  35. echo "</div></center>";
  36. }
  37. else
  38. {
  39. echo 'Brak przedmiotow.';
  40. }
  41.  
  42. for($i=1;$i<=$maxstr;$i++)
  43. {
  44. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  45. }
  46.  
  47. $wynik->free();
  48. $db->close();


Wprawdzie mówiąc nie sprawdziłem go ale powinien działać, no chyba że mogła się wkraść się jakaś literówka.
Takie ważniejsze zmiany:
-Zamiast jednego zapytania do bazy stworzyłem dwa: pierwszy sprawdza ilość przedmiotów, a drugi pokazuje tylko które mieszczą się na odpowiedniej stronie za pomocą klauzuli LIMIT.
-zabezpieczenie którego nie widziałem jeżeli użytkownik wpisałby sam w adresie stronę która nie istnieje: w takim wypadku wybrana zostanie maksymalna możliwa strona
-po co umieszczać pętlę for w instrukcji if gdyż i tak jak nie będzie stron to pętla się nie wykona

waqmaz
Wszystko wygląda fajnie, tylko, że zamiast 8 przedmiotów pokazuje tylko 1.

W kodzie brakuje wzmianki określającej funkcję zmiennej $ile_na_stronie np.
  1. $i=$nr_str*$ile_na_stronie;
. To chyba powinno nam pokazywać nr przedmiotu przy przedmiocie.
Po za tym, coś jest pokręcone, gdyż po dodaniu
  1. $maxstr=$nr_str*$ile_na_stronie;
, wyświetlają się wszystkie strony, a nie wszystkie przedmioty haha.gif
btw. $ile na stronie tez nie dziala =/

Ogólnie to pozmieniałem twój kod i teraz działałby idealnie, gdyby wyświetlał po 9 przedmiotów, a nie po jednym.
  1. <?php
  2.  
  3. @ $db = new mysqli('localhost', 'root', 'haslo', 'biblioteka');
  4. $zapytanie = "select * from przedmiot";
  5. $wynik = $db->query($zapytanie);
  6. $ile_znalezionych = $wynik->num_rows;
  7. $wynik->free();
  8. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  9. $ile_na_stronie=1;
  10.  
  11. $max_stron=(int)(ceil($ile_znalezionych/$ile_na_stronie));
  12. $nr_str=(int)$_GET['numer_strony'];
  13.  
  14. //zabezpieczenie - tego nie sprawdzajcie
  15. if($nr_str<1){$nr_str=1;}else if ($nr_str>$max_stron){$nr_str=$max_stron;}
  16. //koniec zabezpieczenia
  17.  
  18. if ($ile_na_stronie>0)
  19. {
  20. $zapytanie = "select * from przedmiot LIMIT ".(($nr_str-1)*$ile_na_stronie).", ". $ile_znalezionych;
  21. $wynik = $db->query($zapytanie);
  22. $wiersz = $wynik->fetch_assoc();
  23. echo '<center><div class="rwo">';
  24. echo "<p><b>".$nr_str.". Tytuł: ";
  25. echo ($wiersz['tytul']);
  26. echo "</b></p>";
  27. echo "</div></center>";
  28. }
  29. else
  30. {
  31. echo 'Brak przedmiotow.';
  32. }
  33.  
  34. for($i=1;$i<=$max_stron;$i++)
  35. {
  36. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  37. }
  38. $wynik->free();
  39. $db->close();
  40.  
  41. ?>


"drugi pokazuje tylko które mieszczą się na odpowiedniej stronie za pomocą klauzuli LIMIT." - to chyba nie działa.
Wiem, brakuje pętli wyświetlającej ilość przedmiotów na jednej stronie, ale nie wiem jak to zrobić. Właściwie to zmienna $ile_na_stronie nie jest tą, na jaką wskazuje jej nazwa, a raczej, co, które wyświetlenie powinno być przedmiotu. Do zmiennej $ile_na_stronie trzeba przypisać jakąś pętle. Kurde...
Dlatego drugie zapytanie równie dobrze, może być bez tego ile na stronie, gdyz to nic nie daje - pomnozenie razy 1:
  1. $zapytanie = "select * from przedmiot LIMIT ".($nr_str-1).", ". $ile_znalezionych;

Mmm... trzeba coś wymyślić.

Równie dobrze kod w skrócie może wyglądać tak, czyli nie potrzeba w ogóle zmiennej $ile na stronie ;/

  1. @ $db = new mysqli('localhost', 'root', 'haslo', 'biblioteka');
  2. $zapytanie = "select * from przedmiot";
  3. $wynik = $db->query($zapytanie);
  4. $ile_znalezionych = $wynik->num_rows;
  5. $wynik->free();
  6. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  7.  
  8. $max_stron= $ile_znalezionych;
  9. $nr_str= $_GET['numer_strony'];
  10.  
  11. if($nr_str<1){$nr_str=1;}else if ($nr_str>$max_stron){$nr_str=$max_stron;}//zabezpieczenie - tego nie sprawdzajcie
  12.  
  13. $zapytanie = "select * from przedmiot LIMIT ".($nr_str-1).", ". $ile_znalezionych;
  14. $wynik = $db->query($zapytanie);
  15. $wiersz = $wynik->fetch_assoc();
  16.  
  17. echo '<center><div class="rwo">';
  18. echo "<p><b>".$nr_str.". Tytuł: ";
  19. echo ($wiersz['tytul']);
  20. echo "</b></p>";
  21. echo "</div></center>";
  22.  
  23. for($i=1;$i<=$max_stron;$i++)
  24. {
  25. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  26. }
  27.  
  28. $wynik->free();
  29. $db->close();


Jak dopisać zmienną tak, aby wyświetlała np. po 9 przedmiotów na stronie?
radziopoke
Zauważyłem moje błędy które zrobiłem ale to dopiero po teście na własnej bazie danych tongue.gif

  1. @ $db = new mysqli('localhost', 'root', 'jakieshaslo', 'biblioteka');
  2. $zapytanie = "select * from przedmiot";
  3. $wynik = $db->query($zapytanie);
  4.  
  5. $ile_znalezionych = $wynik->num_rows;
  6. $wynik->close();
  7.  
  8. echo "<center><p>Ilość znalezionych pozycji: ".$ile_znalezionych."</p></center>";
  9.  
  10. $ile_na_stronie=9;
  11. $maxstr=(int)(ceil($ile_znalezionych/$ile_na_stronie));
  12.  
  13. $nr_str=(int)$_GET['numer_strony'];
  14.  
  15. //zabezpieczenie przed pustymi i ujemnymi numerami_strony
  16. if($nr_str<1){$nr_str=1;}else if ($nr_str>$maxstr){$nr_str=$maxstr;}
  17.  
  18. if ($ile_na_stronie>0)
  19. {
  20. $zapytanie = "select * from przedmiot LIMIT ".(($nr_str-1)*$ile_na_stronie).", ".$ile_na_stronie;
  21. $wynik = $db -> query($zapytanie);
  22. $i=(($nr_str-1)*$ile_na_stronie)+1;
  23. while (($wiersz = $wynik -> fetch_assoc()) !== null)
  24. {
  25. echo '<center><div class="rwo">';
  26. echo "<p><b>".$i.". Tytuł: ";
  27. echo ($wiersz['tytul']);
  28. echo "</b></p>";
  29. echo "</div></center>";
  30. $i++;
  31. }
  32. }
  33. else
  34. {
  35. echo 'Brak przedmiotow.';
  36. }
  37.  
  38. for($i=1;$i<=$maxstr;$i++)
  39. {
  40. echo '<a href="index.php?action=kategorie/przedmioty&numer_strony='.$i.'">['.$i.']'.'</a>'.' ';
  41. }
  42.  
  43. $wynik->free();
  44. $db->close();
  45.  


Kilka błędów które naprawiłem:
1. drugie zapytanie było lekko źle napisałem - poprawione
2. Odczytywało tylko jedną pozycję. Wytłumaczenie było proste brak pętli smile.gif
3. Nie wyświetlało numeru przedmiotu dlatego zmienna i też dostała swoją rolę smile.gif

Teraz zmienna $ile_na_stronie wskazuje maksymalną na ilość przedmiotów wyświetlanych na jednej stronie

No i w czasie moich testów wyskoczył mi pewien błąd ale to dlatego że nie chciało0 mi się zmieniać nazwy pliku w linii 40. Należy o tym pamiętać jak będzie się chciało by skrypt pracował w inaczej nazwanym pliku

No i to by było na tyle smile.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.