Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Kotwice do stron nowości pobieranych z bazy
Forum PHP.pl > Forum > Przedszkole
artoor
Proszę o pomoc w rozwiązaniu następującego problemu.

Jest sobie strona, niech będzie to: www.mojadomena/aktualnosci na której wyświetla się pięć newsów z bazy danych (każdy news ma dodany atrybut id=”news-1”, id=”news-2” id=”news-5” wartości liczbowe są kolejnymi wierszami gdzie id jest kluczem głównym w MySQL). Jako że podstrona aktualności pobiera newsy z bazy, oczywiste jest, że będzie ich coraz więcej, zatem wykorzystuję paginację, w której kolejne pięć nowości będzie znajdowało się na stronie www.mojadomena/aktualnosci,2 , następne na www.mojadomena/aktualnosci,3 itd.

Sortowanie rzecz jasna jest malejące, ponieważ każdy nowy wpis otrzymuje wyższy numer id który musi wyświetlać się na pierwszej podstronie www.mojadomena/aktualnosci , co za tym idzie, news o id=”news-6”, czyli ten najnowszy powoduje, że id=”news-1”, który jeszcze przed chwilą był na podstronie www.mojadomena/aktualnosci teraz przeskakuje na www.mojadomena/aktualnosci,2

Nie byłoby w tym nic niepokojącego mnie, gdyby nie fakt, że chciałbym móc odnosić się do poszczególnych nowości z innych podstron (tudzież z kanału RSS/Atom) za pomocą kotwic do nich (na zasadzie www.mojadomena/aktualnosci#news-3 itp.)
Problem mam nadzieje jest zrozumiały. Ponieważ przy pięciu newsach w bazie wiem, że odnośnik www.mojadomena/aktualnosci#news-3 zadziała prawidłowo, ale gdy ilość wpisów w bazie będzie już dajmy na to 9, to prawidłowo odnośnik powinien wskazywać na www.mojadomena/aktualnosci,2#news-3 przy 15 wpisach w bazie ten znów nie zadziała, bo należy użyć wówczas www.mojadomena/aktualnosci,3#news-3. Czyli prawidłowy adres jest zależny od ilości wpisów w bazie.

Jakie widzicie rozwiązanie takiego problemu? Zaznaczam, że zależy mi na tym, żeby móc odnieść się do poszczególnych newsów zarówno z innych podstron, jak i kanału RSS/Atom.

Za wszelkie sugestie dziękuję smile.gif
CuteOne
Jeżeli odnosisz się tylko do jednego wpisu to po co ci w url'u paginacja?? zamiast www.mojadomena/aktualnosci,2#news-3 wystarczy www.mojadomena/aktualnosci#news-3

Twój system paginacji chyba nie działa jak należy? w jaki sposób nowy wpis, może powodować przesunięcie wpisu starszego??

np.

aktualnosci,2
news-10
news-9
news-8
news-7
news-6

aktualnosci,1
news-5
news-4
news-3
news-2
news-1

jest prawidłowym zapisem - id powinno pozostać unikalne tak aby łatwo, można było operować na danych
artoor
Dzięki za reakcję smile.gif Wyjaśniam nieścisłości smile.gif
Cytat
Jeżeli odnosisz się tylko do jednego wpisu to po co ci w url'u paginacja??

Chodzi mi o to, żeby pomimo, że odnoszę się do na przykład wpisu o id="news-3" osoba widziała również wpisy przed nim i po nim (czyli cztery pozostałe na tej podstronie wynikającej z paginacji). A dzięki efektowi "kotwiczenia" #news-3 przeglądarka zjechała do tego wpisu i na przykład za pomocą odpowiedniego ostylowania id tego wpisu postawić tam jakiś znacznik - ale to nie jest tematem postu smile.gif
Cytat
Twój system paginacji chyba nie działa jak należy? w jaki sposób nowy wpis, może powodować przesunięcie wpisu starszego?? np.

aktualnosci,2
news-10
...
news-6

aktualnosci,1
news-5
...
news-1

jest prawidłowym zapisem - id powinno pozostać unikalne tak aby łatwo, można było operować na danych

Zgadza się, i tak by było, gdyby nie sortowanie malejące w bazie za pomocą zapytania
Kod
"select * from news order by id DESC limit $strona, $iloscNaStronie";

Gdy zmienię na sortowanie rosnące
Kod
"select * from news order by id ASC limit $strona, $iloscNaStronie";
wówczas wszystko zachowuje się prawidłowo, tak jak w cytowanym przez Ciebie fragmencie... tyle że idea newsów się trochę chwieje, wszak najświeższe wpisy są wyższymi numerami www.mojadomena/aktualnosci,2 sad.gif a zdaje się, że z założenia powinny być niższe, domyślnie po prostu www.mojadomena/aktualnosci.
Jakieś dodatkowe sugestie? smile.gif
CuteOne
Chyba załapałem w czym masz problem ;D sprawdź
  1. <?php
  2.  
  3. $strona = $_GET['strona'];
  4. $limit = 2;
  5.  
  6. $start = ($strona - 1) * $limit;
  7.  
  8. $select = mysql_query("SELECT * FROM news ORDER BY id ASC LIMIT $start, $limit");
  9.  
  10. $news = array();
  11. while($row = mysql_fetch_assoc($select)) {
  12.  
  13. $news[] = $row;
  14. }
  15.  
  16. krsort($news);
  17.  
  18. echo '<pre>'; print_r($news);
  19.  
  20. ?>


Pobierasz dane tak jak się to zazwyczaj robi przy paginacji czyli od najmniejszego do największego a potem dzięki funkcji krsort sortujesz już pobrane dane wg. klucza
artoor
Wielkie dzięki!
Faktycznie rozwiązuje to poniekąd mój problem.
Widzę jednak, że nie da się pogodzić rozwiązania, które mi zaproponowałeś z numeracją wynikającą z paginacji. Teraz jest faktycznie tak jak pisałeś
Cytat
aktualnosci,2
news-10
news-9
news-8
news-7
news-6

aktualnosci,1
news-5
news-4
news-3
news-2
news-1

A zatem, im nowszy wpis, tym wyższy numer, tak więc przybywa wartości aktualnosci,2, aktualnosci,3, aktualnosci,4 (jest to prawidłowe). Borykam się więc z problemem nie do rozwiązania, bo z jednej strony chciałbym mieć najnowsze wpisy dla aktualnosci,1 (wszak ta strona otwiera się domyślnie, a dokładniej po prostu aktualności bez parametru, co jest równe aktualności,1), ale wyklucza to unikalność adresu dla wpisu o określonym id. Zatem wędrują one do aktualnosci,x (gdzie x, to ostatnia strona z najnowszymi wpisami) Jak to się mówi, albo rybki, albo akwarium wink.gif Zastanawiam się jeszcze nad jakąś regułą w .htaccess, albo dokładniejszą analizę (nie mojego autorstwa) funkcji stronicującej... tak czy inaczej dzięki za wszelkie sugestie 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.