Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [1][2][3][4][5]... itd. strony.
waqmaz
post 19.05.2011, 21:39:41
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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.

Ten post edytował waqmaz 19.05.2011, 21:41:06
Go to the top of the page
+Quote Post
Spawnm
post 19.05.2011, 21:41:41
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Poczytaj o paginacji
Go to the top of the page
+Quote Post
aeaeae
post 20.05.2011, 01:12:45
Post #3





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


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>';


Ten post edytował aeaeae 20.05.2011, 01:46:36
Go to the top of the page
+Quote Post
waqmaz
post 20.05.2011, 17:36:33
Post #4





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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.

Ten post edytował waqmaz 20.05.2011, 17:48:23
Go to the top of the page
+Quote Post
aeaeae
post 20.05.2011, 17:57:36
Post #5





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


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. ?>
Go to the top of the page
+Quote Post
waqmaz
post 20.05.2011, 18:34:33
Post #6





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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?

Ten post edytował waqmaz 20.05.2011, 18:36:33
Go to the top of the page
+Quote Post
aeaeae
post 20.05.2011, 18:38:35
Post #7





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


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

Ten post edytował aeaeae 20.05.2011, 18:41:17
Go to the top of the page
+Quote Post
waqmaz
post 20.05.2011, 19:02:01
Post #8





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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"; } ?>


Ten post edytował waqmaz 20.05.2011, 19:04:35
Go to the top of the page
+Quote Post
aeaeae
post 20.05.2011, 19:19:56
Post #9





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


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>'.' ';


Ten post edytował aeaeae 20.05.2011, 19:20:22
Go to the top of the page
+Quote Post
waqmaz
post 20.05.2011, 22:00:53
Post #10





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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ć =/

Ten post edytował waqmaz 20.05.2011, 22:01:52
Go to the top of the page
+Quote Post
WebCM
post 20.05.2011, 22:45:47
Post #11





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Ź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


Ten post edytował WebCM 20.05.2011, 23:00:31


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
waqmaz
post 20.05.2011, 23:35:37
Post #12





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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.

Ten post edytował waqmaz 20.05.2011, 23:39:28
Go to the top of the page
+Quote Post
WebCM
post 21.05.2011, 11:29:27
Post #13





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


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();


Ten post edytował WebCM 21.05.2011, 11:32:57


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
aeaeae
post 21.05.2011, 12:50:58
Post #14





Grupa: Zarejestrowani
Postów: 117
Pomógł: 23
Dołączył: 5.03.2011

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


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;
Go to the top of the page
+Quote Post
waqmaz
post 23.05.2011, 15:50:20
Post #15





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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? =/

Ten post edytował waqmaz 23.05.2011, 16:44:21
Go to the top of the page
+Quote Post
radziopoke
post 24.05.2011, 14:23:09
Post #16





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

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


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

Go to the top of the page
+Quote Post
waqmaz
post 25.05.2011, 17:10:43
Post #17





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

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


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?

Ten post edytował waqmaz 25.05.2011, 17:13:25
Go to the top of the page
+Quote Post
radziopoke
post 31.05.2011, 15:38:46
Post #18





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

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


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
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: 24.06.2025 - 14:27