Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [wolontariat]Stronicowanie
Forum PHP.pl > Inne > Giełda ofert > Poszukuję
wojok1000000
Witam. Potrzebuję stronicowania, które by pobierało ze pliku txt rekordy. Mam taki skrypt [znaleziony w Internecie], ale jest jedna wada, że nie ma tam jak ustawić limitu na stronę.
Kod index.php
  1. <?php
  2. $page = isset($_GET['page']) ? $_GET['page'] : 1; //Strona
  3. $wszystkie_dane=file_get_contents('dane.tpl'); //Nazwa pliku z danymi
  4. $dane=explode('*****', $wszystkie_dane); // w jaki sposób ma rodzielać plik na kilka części; w tym przypadku to "*****"
  5. $all = count($dane); // liczy ile jest stron z zanymi
  6. echo "$dane[$page]"; // Wyświetla dane na stronia
  7. $npage = $page+1; // Następna strona
  8. $ppage = $page-1; // Poprzednia strona
  9. $max = $all-2; // Ilość stron (nie wiem dla czego ale zawsze musze odejmować 2 aby uzyskać realną ilość stron)
  10. //
  11. // ZABEZPIECZENIA:
  12. //
  13. if ($page <= 0 || $page > $max){ // Jeżeli strona jest mniejsza od zera lub większa od maximum to
  14. echo "Nie ma takiej strony!"; // wyświetla to
  15. }
  16. if ($max > 1){ // jezeli jest więcej niż jedna strona to
  17. if ($page == 1) { // sprawdz czy jest równa 1
  18. echo "<a href='index.php?page=$npage'>Następna strona</a>"; // i wyświetl następną strone
  19. }else { // inaczej
  20. if ($page == $max){ // sprawdź czy jest równa max
  21. echo "<a href='index.php?page=$ppage'>Poprzednia strona</a>"; // i wyświetl poprzednią strone
  22. } else { // jeszcze raz inaczej :-)
  23. echo "<a href='index.php?page=$ppage'>Poprzednia strona</a>"; // wyświetl na jednej stronie
  24. echo "<a href='index.php?page=$npage'>Następna strona</a>"; // link do przodu i do tylu;-)
  25. }
  26. } // i zamykamy wszystkie instrukcje;-)
  27. }
  28. ?>


Zawartość pliku txt
Kod
<?php


***** /// zaczynamy rekord od 5 gwiazdek;-)
tresc ... /// tutaj jest 1 rekord
***** /// kończymy rekord 5 gwiazdami
bla bla ... /// tutaj jest 2 rekord
*****
etc.


?>

Chodzi tylko o zmianę, abym mógł ustawiać limit ile ma wyświetlać rekordów na stronie.
jcubic
Szósta linia


  1.  
  2. $num_records = 3; // wyświetl 3 rekordy (można ustawić ze zmiennej $_GET)
  3. echo implode("\n", array_splice(explode("\n", $dane[$page]), 0, $num_records)); // Wyświetla dane na stronie
  4.  
wojok1000000
Tak, tylko znalazłem kilka błędów. Gdy np dam index.php?page=24 to wyświetla "Nie ma takiej strony!" i to jest ok, ale dalej wyświetla łączę następna strona. Ten podział, że np 3 rekordy na stronę nie działa, ustawiłem 5 i mam 20 rekordów w pliku i wyświetla po jednym. Oraz możesz zrobić taki coś, że bd łącze poprzednia strona, dalej 1,2,3,4,5,6 etc a na końcu następna strona. Tutaj masz adres, gdzie mam te pliki http://pewnyzysk.com/str . To by było na tyle smile.gif
kiler129
Wiem, że jestem marudny ale dlaczego używasz plików txt? smile.gif
Mamy 2010 rok, dostęp do PHP5, PDO, SQLite ... dlaczego więc pliki txt?
wojok1000000
Dlatego, że niby jestem po kursie PHP i MySql, ale w tym problem, że ja na bazie MySql nie umiem operować [tu: obsługiwać]. I lepiej wtedy na pliku txt i też większa swoboda jest, ponieważ mam go pod ręką smile.gif
lukaskolista
osmiele sie nie zgodzic biggrin.gif latwiej jest pracowac na pliku txt? Zalozmy, ze masz 100 000 rekordow. Znajdz mi ten, gdzie nazwa uzytkownika to Jacek, a nazwisko to Kwiatkowski, pobierz mi dla niego (oczywiscie z innych plikow) obrazki, artykuly, wystawione aukcje itp. - zajedziesz serwer. Wlasnie po to sa systemy bazodanowe. Nie umiesz obslugiwac MySQL? phpmyadmin przyjdzie z pomoca smile.gif kiedys nie znajac podstaw SQL zrobilem tam prosta baze z 2 tabel
Pilsener
Zbędna dyskusja, jak ktoś robi na plikach to widocznie musi, tu masz wszystko o stronicowaniu plików txt i nie tylko:
http://www.forumweb.pl/viewtopic.php?t=39103
dr_bonzo
> Zbędna dyskusja, jak ktoś robi na plikach to widocznie musi, tu masz wszystko o stronicowaniu plików txt i nie tylko:


Ojtam ojtam. Skoro pyta o stronicowanie, to potem dojda joiny, wyszukiwanie - a przeciez chcial uniknac UCZENIA SIE mysqla itd.
A to wszystko ma w MySQL i ma do tego mase kursow == latwiej sie nauczyc, i lepiej - skoro i tak musi sie pouczyc.
wojok1000000
Mogę potwierdzić moją tezę, że lepiej jest operować na plikach txt, bo mam wszystko pod ręką oraz ma to na celu wpisywać tam kilka notatek, które zawsze mają być dostępne. Nie chcę tworzyć czegoś skomplikowanego, ani zakładać bazy danych użytkowników lub w celu wyszukiwania, bo wtedy to trzeba użyć MySql. Mi tylko jest potrzebne te stronicowanie na kilka prostych operacji. Z tego linku co mi podesłał "Pilsener" nic nie wywnioskowałem i moje pytanie brzmi czy może ktoś pomóc mi napisać ten kod wg wytycznych, które znajdują się wyżej?
Pilsener
Niech każdy robi jak musi/lubi, jak ma wybór pliki a baza to sam prędzej czy później dojdzie do tego, że lepiej jest robić na bazie winksmiley.jpg

Cytat
Z tego linku co mi podesłał "Pilsener" nic nie wywnioskowałem
- no nie wierzę, to po kolei:

1. Liczysz rekordy w pliku:
  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. if(fgets($uchwyt)){
  4. $ile_rekordow++;
  5. }
  6. }
  7. fclose($uchwyt);
  8. echo $ile_rekordow;


2. Ustalasz zakres tych rekordów:
  1. $l_odp_nastronie = 5;
  2. $do = $ile_rekordow-(($a-1)*$l_odp_nastronie);
  3. $od = $do-$l_odp_nastronie;
- $a to numer strony pobierany z GET, reszta chyba nie wymaga komentarza?

3. Pobierasz odpowiednie rekordy z zakresu:
  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. $linia = rtrim(fgets($uchwyt));
  4. $licznik++;
  5. if($licznik>$od && $licznik<=$do){
  6. $tabliczka[] = $linia;
  7. }
  8. }
  9. fclose($uchwyt);
- w tablicy $tabliczka masz potrzebne rekordy, wystarczy wyświetlić na stronie

4. Jeśli chcesz bardziej zaawansowanej nawigacji niż next/prev to użyj np. takiej funkcji:
  1. function tresc_pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$a) { //funkcja tworz�ca nawigacj�
  2. $l_odp_podz = intval($l_odp/$l_odp_nastronie)+1;
  3. $l_odp_podz_mod = $l_odp%$l_odp_nastronie;
  4. if($l_odp_podz_mod>0){++$l_odp_podz;}
  5. if($a>=$l_odp_podz){$a=$l_odp_podz-1;}
  6. if($a>1){$tablica['prev']=$a-1;}else {$tablica['prev']=0;}
  7. if($a<=$l_odp_napasku){$koniec=$l_odp_napasku*2+2;}else{$koniec=$a+$l_odp_napasku+1;}
  8. if($a<=$koniec-$l_odp_napasku){$star=$a-$l_odp_napasku;}
  9. if($a>=$l_odp_podz-$l_odp_napasku){$star=$l_odp_podz-$l_odp_napasku*2-1;}
  10. if($koniec>$l_odp_podz){$koniec=$l_odp_podz;}
  11. if($star<1){$star=1;}
  12. for($i=$star;$i<$koniec;++$i){
  13. if($i<$a){$tablica[]=$i;}
  14. if($i==$a){$tablica['active'] = $i;}
  15. if($i>$a){$tablica[]=$i;}
  16. }
  17. if($a<$l_odp_podz-1){$tablica['next']=$a+1;}else{$tablica['next']=0;}
  18. return $tablica;
  19. }
- funkcja generuje pasek nawigacyjny złożony z numerów stron o ustalonej szerokości z zaznaczeniem strony bieżącej, poprzedniej oraz następnej w postaci tablicy, wystarczy połączyć z HTML.

Spróbuj coś zrobić, dostałeś chyba wskazówek aż nadto jak to porządnie ogarnąć smile.gif
lukaskolista
  1. #
  2. $dane=explode('*****', $wszystkie_dane); // w jaki sposób ma rodzielać plik na kilka części; w tym przypadku to "*****"
  3. $all = count($dane); // liczy ile jest stron z zanymi

rozumiem, ze strony oddzielane sa znakami *****? Jezeli tak, to w zmiennej $dane strona x to index x-1, np. strona 4 to index 3, strona 9 to index 8
wojok1000000
Tak, tylko moje umiejętności ograniczają się do odczytywania danych ze zmiennych, plików i to tyle. A ja, żeby się nauczyć PHP to musi minąć dużo czasu, aby to opanować, ale przejdźmy do rzeczy. Połączyłem te skrypty w całość oraz dodałem i przypisałem zmiennej pliczek = dane.txt, ale na stronie wyświetla się "10" na stronie nic więcej oraz dodałem odczyt zmiennej tabliczka, a co do skryptu mam wątpliwości czy dobrze zrobiłem. Wiem może to głupie tak komuś odwalać robotę, ale szczerze powiem, że nie mam czasu na naukę PHP, a akurat tego skryptu bardzo potrzebuję. Za pomoc bardzo dziękuję smile.gif
lukaskolista
no dobra...

dane.txt
  1. strona 1
  2. *****
  3. strona 2
  4. *****
  5. strona 3

stronnicowanie.php
  1. <?php
  2.  
  3.  
  4. $page = (isset($_GET['page']) ? (int)$_GET['page'] : 1);
  5.  
  6. $data = file_get_contents('dane.txt');
  7. $pages = explode('*****', $data);
  8.  
  9. echo (isset($pages[($page-1)]) ? $pages[($page-1)] : 'Strona '.$page.' nie istnieje');
  10.  
  11. ?>


o to chodzilo?
wojok1000000
Tylko, że ten skrypt nie działa sad.gif
lukaskolista
mi dziala tongue.gif pliki sa w tym samym folderze? Jakie bledy wywala?
wojok1000000
Musiałem tylko zmienić dane w dane.txt. I wyświetla tylko "Strona1", ale nie ma odnośników nawigacyjnych tzn poprzedni,1,2,3,4,5,następny etc.
lukaskolista
a nie laska dorobic sobie? Wystarczy do adresu dopisac ?page=2, w moimp przypadku http://127.0.0.1/test.php?page=2
co bylo zle w pliku?

co to za dupiaty kurs php, na ktorym tego nie ucza?
wojok1000000
Chodzi Tobie pewnie o includowanie, aleja chciałem, aby automatycznie dodawało strony, a nie, że muszę ręcznie dodawać. A co do pytania kursu to jest to kurs video "Php i MySql" wydany przez Global Profit
lukaskolista
  1. <?php
  2.  
  3.  
  4. echo '<html>';
  5. echo '<head>';
  6. echo '<style>';
  7. echo 'a {';
  8. echo 'text-decoration: none;';
  9. echo 'color: black;';
  10. echo '}';
  11. echo '#this_page {';
  12. echo 'color: red;';
  13. echo 'font-weight: bold;';
  14. echo '}';
  15. echo '</style>';
  16. echo '</head>';
  17. echo '<body>';
  18.  
  19. $page = (isset($_GET['page']) ? (int)$_GET['page'] : 1);
  20.  
  21. $data = file_get_contents('dane.txt');
  22. $pages = explode('*****', $data);
  23. $pages_count = count($pages);
  24.  
  25. $index = 1;
  26. $pagination = '';
  27. while ($index <= $pages_count) {
  28. $pagination .= '<a '.(($index === $page) ? 'id="this_page"' : '').' href="?page='.$index.'">'.$index.'</a> | ';
  29.  
  30. $index++;
  31. }
  32. $pagination = substr($pagination, 0, -2);
  33.  
  34. echo $pagination;
  35. echo '<br />';
  36.  
  37. echo (isset($pages[($page-1)]) ? $pages[($page-1)] : 'Strona '.$page.' nie istnieje');
  38.  
  39. echo '</body>';
  40. echo '</html>';
  41. ?>

jak chcesz dodawac strony automatycznie to musisz napisac skrypt (osobny), ten sluzy tylko do wyswietlania
  1. <?php
  2.  
  3.  
  4. $page = 'tresc nowej strony';
  5.  
  6. $file = file_get_contents('dane.txt');
  7. file_put_contents('dane.txt', $file."\r\n".'*****'."\r\n".$page);
  8.  
  9. ?>

to powinno pomoc
wojok1000000
Nie chodzi mi o automatyczne dodawanie tekstu do pliku dane.txt, bo tak zrozumiałem, ale chodzi aby automatycznie tworzył następne strony do nawigacji gdy np na stronie znajduje się 3 rekordy, po przekroczeniu tej liczby tworzy następną stronę itd, a nawigacja jednak ma być bez łączy następna / poprzednia. Dlaczego wszystkie znaczniki htmla typu <body> <style> etc. wyświetlasz przez echo?

Przetestowałem skrypt i działa bardzo dobrze, dziękuję smile.gif
lukaskolista
Co rozumiesz przez slowo "rekord"? Linijke pliku? Opisz dokladnie w podpunktach, czego potrzebujesz

Cytat
Dlaczego wszystkie znaczniki htmla typu <body> <style> etc. wyświetlasz przez echo?

poniewaz jest to prawidlowy sposob, a wychodzenie co chwile z php i wracanie czesto jest bardzo nieczytelne

w dodatku taki sposob daje duzo wieksze mozliwosci, np. ta linijka kodu
  1. #
  2. $pagination .= '<a '.(($index === $page) ? 'id="this_page"' : '').' href="?page='.$index.'">'.$index.'</a> | ';

nie da sie jej napisac inaczej, niz w php

reszte znacznikow zwracam przez echo, zeby zachowac spojnosc
wojok1000000
A jest możliwość ustalenia ile rekordów ma być na stronie, bo to by było bardzo potrzebne ?

Rekord dla mnie to tutaj dla mnie znaczy treść pomiędzy ***** czyli np mamy:
*****
TREŚĆ
*****

to dla mnie rekordem będzie "TREŚĆ".

A czego potrzebuję to tak:
- stronicowania treśći pliku dane.txt na 3 rekordy na stronę
- automatycznego dodawania kolejnej strony jeśli jest więcej rekordów w pliku niż w warunku, który =3
Cysiaczek
Ponieważ nie masz czasu na naukę php i pilnie potrzebujesz skrypt, przenoszę na Giełdę ofert -> Poszukuję i opatruję tagiem [wolontariat]. Jeśli jednak będziesz chciał usunąć ten tag (bo np. uznasz, że skoro nie umiesz i nie masz czasu się naumieć i wobec tego zechcesz komuś zapłacić za zrobienie tego za Ciebie), napisz na PW do któregoś dostępnego moderatora.
Nie pisz tylko PW, że to przecież jest forum, że jak nie chcę, mogę nie pomagać ale mam nie przeszkadzać, że zachowuję się jak polaczek, czy też innego tekstu, w którym nie zawrzesz realnych prób samodzielnego napisania wymaganych funkcjonalności i co za tym idzie, nie zaczniesz szanować czasu poświęconego Ci tutaj przez ~lukaskolista (Ty to masz zdrowie tongue.gif ).
Wszystko przez to, ze to jest forum dla programistów oraz ludzi, którzy chcą nimi zostać. Wyjaśnię Ci jeszcze, że jak ktoś chce zostać programistą, to poświęca czas przeznaczony np. na piwo z kolegami, czy inne ciekawe zajęcia i siedzi, programuje, czyta dokumentacje i rozwiązuje problemy które napotkał, samodzielnie itd itp.

Przenoszę tam, gdzie wyżej napisałem
wojok1000000
Ok, nie ma sprawy smile.gif
lukaskolista
  1. <?php
  2.  
  3.  
  4. // Poczatek dokumentu HTML
  5. echo '<html>';
  6. echo '<head>';
  7. echo '<style>';
  8. echo 'a {';
  9. echo 'text-decoration: none;';
  10. echo 'color: black;';
  11. echo '}';
  12. echo '#this_page {';
  13. echo 'color: red;';
  14. echo 'font-weight: bold;';
  15. echo '}';
  16. echo '</style>';
  17. echo '</head>';
  18. echo '<body>';
  19.  
  20. // Ustalanie strony
  21. $page = (isset($_GET['page']) ? (int)$_GET['page'] : 1);
  22.  
  23. // Ustawianie rekordow na strone
  24. $results = 3;
  25.  
  26. // Pobieranie danych
  27. $data = file_get_contents('dane.txt');
  28. $rows = explode('*****', $data);
  29. $pages_count = ceil(count($rows) / $results);
  30.  
  31. // Paginacja
  32. $index = 1;
  33. $pagination = '';
  34. if ($page !== 1 && $pages_count > 1) {
  35. $pagination .= '<a href="?page='.($page-1).'">&lt;&lt;Poprzednia</a>&nbsp;&nbsp;&nbsp;';
  36. }
  37. while ($index <= $pages_count) {
  38. $pagination .= '<a '.(($index === $page) ? 'id="this_page"' : '').' href="?page='.$index.'">'.$index.'</a> | ';
  39.  
  40. $index++;
  41. }
  42. if ($page < $pages_count) {
  43. $pagination .= '&nbsp;&nbsp;&nbsp;<a href="?page='.($page+1).'">Nastepna&gt;&gt;</a>';
  44. }
  45. $pagination = substr($pagination, 0, -2);
  46.  
  47. echo $pagination;
  48. echo '<br />';
  49.  
  50. // Wyswietlanie rekordow
  51. $index = ($page === 1) ? 0 : ($page*$results)-$results;
  52. $end = $index+$results;
  53.  
  54. echo '<hr />';
  55. while ($index < $end) {
  56. if (isset($rows[$index])) {
  57. echo $rows[$index].'<hr />';
  58. }
  59.  
  60. $index++;
  61. }
  62.  
  63. // Koniec dokumentu HTML
  64. echo '</body>';
  65. echo '</html>';
  66.  
  67. ?>


sposob przechowywania danych jak w bazach danych - nie ma zadnych stron, sa po prostu rekordy. To, ile rekordow na strone chcesz wyswietlac ustalasz w zmiennej $results.
wojok1000000
Dziękuję Ci bardzo za czas który poświęciłeś, aby pomóc mi, a raczej napisać ten skrypt. Jestem bardzo wdzięczny. Oczywiście daję pomógł smile.gif

Jeszcze znalazłem jeden drobny błąd tzn. gdy mam jakieś dane w dane.txt i się wyświetlają to cały tekst wyświetla się jako odnośnik kolejnej strony. Przykład masz na pewnyzysk.com/str2/index.php

Cytat(wojok1000000 @ 24.09.2010, 21:53:17 ) *
Dziękuję Ci bardzo za czas który poświęciłeś, aby pomóc mi, a raczej napisać ten skrypt. Jestem bardzo wdzięczny. Oczywiście daję pomógł smile.gif

Jeszcze znalazłem jeden drobny błąd tzn. gdy mam jakieś dane w dane.txt i się wyświetlają to cały tekst wyświetla się jako odnośnik kolejnej strony. Przykład masz na pewnyzysk.com/str2/index.php


Odświeżam temat oraz prośbę, która jest wyżej
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.