Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zadanie logiczne - algorytm
Forum PHP.pl > Forum > Przedszkole
konradkw
Witam
Napisałem prosty skrypt zliczający który wykonuje następujące działanie:
1. Pobieranie zmiennej $ograniczenie od użytkownika (cyfra zapisana w bacie danych)
2. Zlicza ilość postów i zapisuje w zmiennej $ile
3. Dzieli ilość postów $ile przez $ograniczenie i zwraca wartość $stron
4. Jeśli istnieje reszta z dzielenia to to daje 1 do zmiennej $stron aby uwzględnić ogonek a nie tylko te posty które sie mieszczą w dzieleniu.

Oto część kodu zliczająca powyższe:
  1. if (empty($_GET['bkat'])) {
  2. $zap = mysql_query("SELECT 'id' FROM news");
  3. $ile = mysql_num_rows($zap);
  4. $stron = ($ile / $ograniczenie);
  5. $reszta = ($ile % $ograniczenie);
  6. if ($reszta > 0) { ++$stron; }}


Problem polega na tym teraz aby przyporządkować ilość wpisów ($ograniczenie) kolejno do każdej strony w tablicy o ilości elementów $stron.
Po przyporządkowaniu trzeba ograniczyć wyświetlanie tutaj:

  1. $wyn = mysql_query ("SELECT * FROM `news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC");
  2. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  3. {
  4.  
  5.  
  6. ////////Tutaj potrzebuję zrobić ograniczenie wyświetlania
  7.  
  8.  
  9. echo '<div id="tytul_wpisu_bloga">'.$row['tytul'].' </b> </div><br />'.$row['tresc'].'<br /><div id="stopka_wpisu_bloga"><i>'.$row['autor'].'</i> | <i>'.$row['data'].'</i> | <i>Kategoria: '.$row['kategoria'].'</i></div><br /><br><hr><br /><br />'; }


Nadmienię jeszcze że numer strony - poszczególne numery stron są wyświetlane w ten sposób:

  1. echo '<center><b>- '; for ( $x = 1; $x <= $stron; $x++ ) { echo '<a href="index.php?menu=blog&bkat=stylizacje&page='.$x.'">['.$x.']</a> -'; } echo '</b></center></div><div id="prawy_pasek_blog">';


Co oznacza że na dole strony pokazuje się lista stron w postaci: -[1] - [2] - [3] - .... i każda z cyferek przekazuje przez $_GET['page'] numer strony.

Mam nadzieję że wyjaśniłem co i jak w miarę zrozumiale. Zależy mi na tym żeby użyć mojego kodu bo jest krótki i działa jak potrzebuję ale to czego nie mogę rozpracować to wyżej wymienione ograniczenie wyświetlania.

Będę wdzięczny za pomoc!
Pozdrawiam!
b4rt3kk
Ograniczenie wprowadzasz w zapytaniu:

  1. $wyn = mysql_query ("SELECT * FROM `news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC LIMIT {($_GET['page']-1)*$ograniczenie}, $ograniczenie");


a w pętli while wyświetlasz wszystkie wyniki tego zapytania.
konradkw
linijka którą zaproponowałeś zwraca błąd:

  1. Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
b4rt3kk
To daj tak:

  1. $wyn = mysql_query ("SELECT * FROM `news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC LIMIT ".($_GET['page']-1)*$ograniczenie.", $ograniczenie");
konradkw
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given w 2 linijce:

  1. $wyn = mysql_query ("SELECT * FROM `news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC LIMIT ".($_GET['page']-1)*$ograniczenie.", $ograniczenie");
  2. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))


Czy moge dodatkowo prosic o objascienie tego kawalka?
  1. LIMIT ".($_GET['page']-1)*$ograniczenie.", $ograniczenie


Nie bardzo rozumiem jak to ogranicza wyswietlanie.

aha jeszcze jedno pytanko czy w pierwszej linijce wszystkie zmienne nie powinny byc 'miedzy apostrofami pojedynczymi' questionmark.gif

Dziekuje z gory!

Jesli klikniemy na strone pierwsza to czy to dzialanie sie nie wyzeruje?

Zakladam ze $ograniczenie = 3.

(1-1)*3 = 0
(2-1)*3 = 3
(3-1)*3 = 6
(...)

czy to ma okreslic ilosc powtorzen petli while? co w takim razie robi tam ostatnia zmienna $ograniczenie?

Moze cos w tym stylu?

  1. $i=0
  2. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  3. for ($x=1; $x<=$ograniczenie; $x++) {
  4. ++$i;
  5. if (($i <= $ograniczenie) || ($i > ($i-1)) {wyswietlenie postow}
  6. }


Dajcie prosze znac czy ide w dobrym kierunku .. ?

nie wiem dlaczego ale mi pokazuje ze mam niepotrzebna klamre {

  1.  
  2. $i=0;
  3. $wyn = mysql_query ("SELECT * FROM `violin_news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC");
  4.  
  5. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  6.  
  7. {
  8. for ($x=1; $x<=$ograniczenie; $x++)
  9. { ++$i; if (($i <= $ograniczenie) && ($i > ($i-1))
  10. {
  11. echo '<div id="tytul_wpisu_bloga">'.$row['tytul'].' </b> </div><br />'.$row['tresc'].'<br /><div id="stopka_wpisu_bloga"><i>'.$row['autor'].'</i> | <i>'.$row['data'].'</i> | <i>Kategoria: '.$row['kategoria'].'</i></div><br /><br><hr><br /><br />';
  12. }
  13. }
  14. }


Ma to wogle jakis?

Haha wlasnie sprawdzilem swoj kod i owszem dzieli po 3 wpisy na podstrone ale wyswietla TYLKO najnowszy wpis po 3 razy na kazdej strone .. :/

jakies pomysly?

Juz prawie doszedlem do tego ale jeszcze trzeba rozpracowac powtarzanie sie pierwszego wpisu ..

wydaje mi sie ze to jest nie tak jak trzeba:

  1. for ($x=1; $x<=$ograniczenie; $x++)
  2. { ++$i;
  3. if (($i <= $ograniczenie) && ($i > ($i-1))



jesli to pomoze mozna dolozyc zmienna $ile_postow ktora zawiera calkowita liczbe postow (lub ilosc postow w danej kategorii w tym wypadku).


Poprawilem || na && ...

Dalem tak:

  1. $i=0;
  2.  
  3. $wyn = mysql_query ("SELECT * FROM `violin_news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC");
  4.  
  5. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  6.  
  7. {
  8.  
  9. ++$i; if (($i <= $ograniczenie) && ($i > ($i-1)))
  10.  
  11. {echo '<div id="tytul_wpisu_bloga">'.$row['tytul'].' </b> </div>
  12.  
  13. <br />'.$row['tresc'].'<br /><div id="stopka_wpisu_bloga">
  14.  
  15. <i>'.$row['autor'].'</i> | <i>'.$row['data'].'</i> | <i>Kategoria: '.$row['kategoria'].'</i></div>
  16.  
  17. <br /><br><hr><br /><br />';}}


I teraz wyswietla 3 ostatnie wpisy na strone ale te same trzy na kazdej stronie.
nospor
Nie czytałem całego tematu ale bardzo zaciekawił mnie ostatni wpis....

np. ten warunek:
&& ($i > ($i-1)
Sądzisz że $i będzie kiedykolwiek mniejsze od siebie samem zmniejszonej o 1? wink.gif

Cytat
I teraz wyswietla 3 ostatnie wpisy na strone ale te same trzy na kazdej stronie.
No bo za każdym razem masz to samo zapytanie, więc nic dziwnego że ciągle zwraca to samo.

Zaś co do ograniczenia wpisów to robi się to na poziomie MYSQL poprzez LIMIT a nie przez bezsensowne warunki w php

Poczytaj o STRONICOWANIU bo takich tematów było na pęczki u nas na forum czy też w google
konradkw
haha - nie zwrocilem uwagi na to ($i > ($i-1))

Tam kolega proponowal
  1. LIMIT ".($_GET['page']-1)*$ograniczenie.", $ograniczenie");
ale to mi nie chcialo dzialac, mozesz pomoc?

szczerze to nie do konca rozumiem jak to ma dzialac ..
nospor
Kolega dobrze ci proponował. A jeśli ci nie działało to należało napisać co nie działa i przedstawić pełen kod jaki masz, włącznie z generowaniem linków do kolejnych podstron.

Poza tym jak juz ci pisałem nazywa się to STRONICOWANIE. Poszukaj trochę, bo naprawdę bawisz się z rzeczą która byłą już milion razy omawiana na forum.
Nawet w moim podpisie masz klasę, która robi wszystko za Ciebie w kwestii stronicowania.
konradkw
w pierwszym poscie mam generator podstron - taki zliczajazy skrypcik ktory okresla ile ma byc podstron a potem inna linijka (tez w pierwszym poscie) wyswietla liste podstron jaki linki przekazujace GET-em numer danej strony

Pisalem tez co nie dziala i wstawialem caly kod - ktory ma cokolwiek wspolnego z wypisaniem wpisow.

wszystki powinno byc w tym dlugim poscie, aktualnie wyswietlenie wpisow to:

  1. $wyn = mysql_query ("SELECT * FROM `violin_news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC");
  2. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  3. { echo '<div id="tytul_wpisu_bloga">'.$row['tytul'].' </b> </div><br />'.$row['tresc'].'<br /><div id="stopka_wpisu_bloga"><i>'.$row['autor'].'</i> | <i>'.$row['data'].'</i> | <i>Kategoria: '.$row['kategoria'].'</i></div><br /><br><hr><br /><br />'; }




czyli kompletnie bez ograniczenia

JUZ WIEM!!!!

Chodzilo o to ze jak nie przekaze nic w zmiennej $_GET['page'] to wyswietlenie pada bo niema nic do wyswietlenia...exclamation.gif
b4rt3kk
Cytat(konradkw @ 16.11.2012, 13:11:08 ) *
w pierwszym poscie mam generator podstron - taki zliczajazy skrypcik ktory okresla ile ma byc podstron a potem inna linijka (tez w pierwszym poscie) wyswietla liste podstron jaki linki przekazujace GET-em numer danej strony

Pisalem tez co nie dziala i wstawialem caly kod - ktory ma cokolwiek wspolnego z wypisaniem wpisow.

wszystki powinno byc w tym dlugim poscie, aktualnie wyswietlenie wpisow to:

  1. $wyn = mysql_query ("SELECT * FROM `violin_news` WHERE `kategoria` = '$bkat' ORDER BY `id` DESC");
  2. while ($row = mysql_fetch_array($wyn, MYSQL_ASSOC))
  3. { echo '<div id="tytul_wpisu_bloga">'.$row['tytul'].' </b> </div><br />'.$row['tresc'].'<br /><div id="stopka_wpisu_bloga"><i>'.$row['autor'].'</i> | <i>'.$row['data'].'</i> | <i>Kategoria: '.$row['kategoria'].'</i></div><br /><br><hr><br /><br />'; }




czyli kompletnie bez ograniczenia

JUZ WIEM!!!!

Chodzilo o to ze jak nie przekaze nic w zmiennej $_GET['page'] to wyswietlenie pada bo niema nic do wyswietlenia...exclamation.gif



No tak, to chyba oczywiste. A LIMIT ma następującą definicję:

  1. LIMIT x -- wyświetla x wyników
  2. LIMIT x,y -- wyświetla y wyników, zaczynając od x
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.