Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: porcjowanie z pliku nie z mysql
Forum PHP.pl > Forum > Przedszkole
ga-cek
Witam. Przeszukalam juz kilka for i grup dyskusyjnych, ale nie znalazlam odpowiedzi na pytanie. Znalazlam jedynie link do platnego serwisu i platnej porady Web.Reporter.
Dokładnie chodzi mi o to co jest w tej poradzie, czyli
1. jak ma wyglądać plik, z którego będziemy w częściach pobierać informacje na kolejne podstrony.
2. w jaki sposób umieszczać linki do konkretnego fragmentu tekstu pobieranego z tego pliku?
Nie mam dostępu do myslq, więc większość porad, do których dotarłam dla mnie są bezużyteczne.
Byłabym wdzięczna za każdą odpowiedź i poradę.
Pozdrawiam.
misterLu
Mało precyzyjnie sformułowałaś problem, więc przyjmuje założenie, ze chodzi ci o plik postaci:
tekst 1
tekst 2
...
tekst n
---
W takim przypadku porozdzielałbym tekst unikalnymi 'delimiterami', czyli np:
tekst pierwszy poprzedziłbym i zamknął wynikiem polecenia md5('tekst1'), tak samo uczyniłbym z każdym pozostałym tekstem. Zastosowanie funkcji md5() z unikalnymi wartościami srgumentu gwarantuje otrzymanie unikalnych stringów.
Wtedy link np do tekstu trzeciego wyglądałby następująco:
a href=jakis_plki?txt_id=<?echo md5('tekst3')?>, a w jakimś_pliku skrypt sprawdzałby , czy jest podana zmienna $_GET['txt_id'] i jeżeli byłaby podana ta zmienna, to czytałby dokument linijka po linijce, a wszystko, co byłoby zawarte pomiędzy liniami zawierającymi delimieter dla danego tekstu.

To rozwiązanei ma jedną wadę: musiałabyś porównywać każdą linijkę tekstu, a funkcje to realizujące należą do wolnych. Po drugie aby dostać się do tekstu ostatniego trzebaby przeczytać cały plik.
Innym rozwiązaniem , bez tych wad, jest założenie katalogu z osobnymi plikami na każdy tekst. Osobiście polecam to drugie rozwiązanie. Nazwom plików można tak samo zapewnic unikalność, jak delimiterom w 1 plkiu.
ga-cek
Hm, no rzeczywiście być może mało precyzyjnie. Otóż mam pliki które mają po 300kb. Część z nich rzeczywiście podzieliłam na pojedyncze i kolejne linki otrzymuje poprzez:

  1. <?php
  2. $rozsz=&#092;".html\"; 
  3. if(file_exists(&#092;"katalog/$pokaz$rozsz\"))
  4. {
  5. include(&#092;"katalog/$pokaz$rozsz\"); 
  6. } 
  7. else { 
  8. include(&#092;"katalog/index$rozsz\");
  9. } 
  10. ?>


Natomiast mam takich plików jeszcze całe mnóstwo i podzielenie tego na każdy osobny plik zajmie sporo czasu no i zastraszająca liczba tych plików znajdzie się na serwerze. Wolałabym właśnie podzielić tekst w konkretnym tym dużym pliku na części.
Nie za bardzo zrozumiałam, to co napisałeś
Cytat
md5('tekst1')

i co mam wpisać za tekst1 długaśny tekst? No a potem jak go wywołać?
Co tutaj wpisać
Cytat
a href=jakis_plki?txt_id=<?echo md5('tekst3')?>,

za tekst3?
Pozdrawiam!
misterLu
cześć!
md5() to funkcja szyfrująca, czyli zamieniająca 'jakis tekst' na bezsensowny ciąg znaków, jej użycie miałoby na celu tylko to, zeby w linku zamiast costam?txt_id=tekst_o_kotach, user zobaczyl w pasku adresu costam?txt_id=dWQdfFe432rewrWE342Rwfdwe. To tak dla bezpieczenstwa. Bo po co ujawniac swoje nazwy?.
Tu masz więcej o funkcji md5(): http://pl.php.net/manual/pl/function.md5.php

Zaużmy, ze w pliku masz 10 wypracowań, wtedy musisz każde wypracowanie 'okalać' unikalnym stringiem. Równie dobrze może to byc zwykły napis "Wypracowanie pierwsze", ale bezpieczniej jest tam wstawic jakis absurdalny ciąg znaków, bo wtedy masz pewnośc, ze wystąpi on tylko jako delimiter. A ten absurdalny ciąg znaków możesz uzyskać w następujący sposób:
Zrób sobie plik delimiter.php a w nim wpisz:

<?
echo "Delimiter dla pierwszego tekstu : ".md5("1")."<BR>";
echo "Delimiter dla drugiego tekstu : ".md5("2")."<BR>";
echo "Delimiter dla siódmego tekstu: ".md5("7")."<BR>";
?>

zobaczysz , co uzyskasz. Następnie pooddzielaj otrzymanymi delimiterami teksty w plikach.
A w skrypcie zrób tak:

Kod
<?php
$rozsz=".html";
if(file_exists("katalog/$pokaz$rozsz"))
{  
//include("katalog/$pokaz$rozsz");
//zamiast calego pliku potrzebujesz tylko wybrany tekst z tego pliku, a konkretnie tekst, który jest
//zawarty miedzy wybranymi delimiterami.
$delimiter=$_GET['txt_id'];
$lines=file("katalog/$pokaz$rozsz");
$open=0;
foreach($lines AS $key => $value){
if(strstr($value, $delimiter)){
  if($open == 0){
   $open=1;
  }else{
   $open =0;
  }
}
if($open == 1){
  echo $value;
}
}
}
else {
include("katalog/index$rozsz");
}
?>


Kod moze nie byc poprawny, bo go nie sprawdzałem.
A $_GET['txt_id'] to zmienna występująca w linku, czyli w pliku z którego się odwołujesz do tekstu musisz miec link:
HREF=cotam?txt_id=jakiś_unikalny_identyfikator
ga-cek
To jeszcze jeśli byłmógłbys mi powiedzieć jak pociąć tekst w te delimitery, to byłoby super. Więc mam powiedzmy tekt:


To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst ---


to co mam wstawić i gdzie by tekst "To jest jakiś tekst" i "A to inny tekst" wyświetlane był potem na oddzielnych podstronach?

Z góy dzięki i sorki, za te lamerskie pytania, ale tak to jest jak człowiek się uczy smile.gif
Pozdrawiam!
rogrog
Cytat(misterLu @ 2004-10-07 13:27:59)
md5() to funkcja szyfrująca

Zaużmy, ze w pliku masz 10 wypracowań, wtedy musisz każde wypracowanie 'okalać' unikalnym stringiem.

md5 nie szyfruje, a hashuje... a to jak wiadomo jest różnica...

oznacza to między innymi, że wygenerowany hash nie musi być unikatowy - może się zdarzyć (chociaż prawdopodobieństwo oczywiscie jest bardzo niskie) że dla dwóch różnych ciagow wygenerowany zostanie ten sam hash

@ga-cek: jeżeli tworzysz na prawdę poważny serwis to takie rozwiazanie jest niedopuszczalne, ale na własne potrzeby powinno być ok winksmiley.jpg


Cytat
funkcja szyfrująca, czyli zamieniająca 'jakis tekst' na bezsensowny ciąg znaków

szyfrowanie czyli zamienianie na bezsensowny ciąg znaków... ciekawa teoria, gratuluje tongue.gif
ga-cek
W tej chwili już na własne potrzeby, bo przekonałam się, że rzeczywiście bezpieczniej będzie podzielić na pliki wszystko. W zasadzie teraz to już tylko czysta ciekawość jak to zrobić, bo nadal nie wiem jak ;-)
Pozdr!
misterLu
zawartość pliku:
Kod
62cfb1dc0f7647f33e3852f56a48b072
To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst... To jest jakiś tekst...
62cfb1dc0f7647f33e3852f56a48b072
e8400c8735535df6ae549f7b3602e51f
A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst --- A to inny tekst ---
e8400c8735535df6ae549f7b3602e51f


gdzie 'e8400c8735535df6ae549f7b3602e51f' to wynik md5('tekst2').
Cytat
szyfrowanie czyli zamienianie na bezsensowny ciąg znaków... ciekawa teoria, gratuluje

Będę zobowiązany, jak podasz mi równie krótką i bardziej sensowną definicję szyfrowania tekstu, ale taką, by nowicjusz ją zrozumiał.
a79rtur
Jak zrobić uniwersalne porcjowanie wyników na stronie, aby nie pokazywała się cała zawartość tablicy lub tekstowej bazy danych?

Problem

Chcesz dane z pliku tekstowego lub tablicy podzielić na porcje, aby użytkownik mógł przeglądać kilka mniejszych stron z wynikami zamiast jednej ogromnej. Chcesz decydować ile odpowiedzi znajdzie się na każdej ze stron i jak długi będzie pasek nawigacyjny.

Rozwiązanie

Porcjowanie wyników zapytania to ważna czynność podczas pracy z tekstowymi bazami danych lub tablicami, gdy wyniki przekraczają 30 rekordów. Niektóre bazy danych lub tablice liczą nawet kilk tysięcy pozycji więc pokazanie ich wszystkich na jednej stronie WWW nie jest możliwe.

Zamiast pokazywać po kilkaset wyników, można je łatwo porcjować. Nie jest ważne co porcjujesz - mogą to być wpisy na forum, dedykacje w księgach gości, informacje o książkach lub zawartość katalogu produktów w jakimś sklepie.

Opisany poniżej skrypt nie tylko świetnie porcjuje tablice lub tekstowe bazy danych, ale jest niesamowicie elastyczny. Możesz ustawiać ilość danych przypadających na jedną stronę, przekazywać dodatkowe zmienne podczas przechodzenia pomiędzy stronami czy ustalać jak szeroki (np. od 1 do 10) będzie pasek służący do poruszania się pomiędzy stronami z wynikami.

Dodatkowo oprócz klikania na poszczególne strony możesz wykorzystać pola "następna" i "poprzednia", które automatycznie przenoszą o jedną stronę do przodu lub do tyłu. Zobacz jak napisać uniwersalny skrypt do porcjowania wyników:

  1. <?
  2. function pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a) {
  3. $l_odp_podz = intval($l_odp / $l_odp_nastronie);
  4. $l_odp_podz_mod = $l_odp % $l_odp_nastronie;
  5. if ($l_odp_podz_mod>0) $l_odp_podz++;
  6. if ($a<0) $a=0; 
  7. if ($a>=$l_odp_podz) $a=$l_odp_podz-1;
  8. $start = $a-1;
  9. if ($a>0) {$pop=&#092;"<a href=\"\".$skrypt.\"a=$start\">&lt;&lt;&lt;
  10. poprzednia</a> - &nbsp;&#092;";}
  11. else {$pop = &#092;"<font color=gray>&lt;&lt;&lt; poprzednia </font> - &nbsp;\";}
  12. if ($a<$l_odp_napasku) {$koniec = $l_odp_napasku*2+1;}
  13. else {$koniec = $a+$l_odp_napasku+1;}
  14. if ($a<=$koniec-$l_odp_napasku) {$star=$a-$l_odp_napasku;}
  15. if ($a>=$l_odp_podz-$l_odp_napasku) {$star=$l_odp_podz-$l_odp_napasku*2-1;}
  16. if ($koniec>$l_odp_podz) $koniec = $l_odp_podz;
  17. if ($star<0) $star=0;
  18. for ($i=$star; $i<$koniec; $i++) {
  19. if ($i <> $a) { $pasek .= &#092;"<a href=\"\".$skrypt.\"a=$i\">\";}
  20. else { $pasek .= &#092;"<font color=red><b>\"; }
  21. if ($l_odp_podz<>1) {$pomocniczy = $i+1;}
  22. if ($i<>$a) { $pasek .= &#092;"$pomocniczy</a> &nbsp;\"; }
  23. else {$pasek .= &#092;"$pomocniczy</b></font> &nbsp;\";}
  24. }
  25. $dalej = $a+1;
  26. if ($a<$l_odp_podz-1) 
  27.  {$nas=&#092;"- <a href=\"\".$skrypt.\"a=$dalej\">następna &gt;&gt;&gt; </a>\";}
  28. else { $nas = &#092;"- <font color=gray>następna &gt;&gt;&gt; </font>\";}
  29. if ($pomocniczy>0) {$br= &#092;"<br> $pop $pasek $nas\"; }
  30. echo &#092;"<center> znalezionych: <b>$l_odp</b> na <b>$l_odp_podz</b> 
  31. stronach $br</center>&#092;";
  32. }
  33.  
  34. $l_odp_nastronie=10;
  35. $l_odp_napasku=5;
  36. $skrypt=&#092;"index.php?\";
  37.  
  38. // wczytanie pliku
  39. $baza=file(&#092;"baza.txt\");
  40.  
  41. // uzyskanie ilości linijek/rekordów
  42. $l_odp = count($baza);
  43.  
  44. pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a);
  45.  
  46. // wyświetlenie wyników z bazy danych
  47. $start=$a*$l_odp_nastronie;
  48. if ($start+$l_odp_nastronie>$l_odp) 
  49. $l_odp_nastronie=$l_odp % $l_odp_nastronie;
  50. for ($i=$start;$i<$start+$l_odp_nastronie;$i++) {
  51. echo $baza[$i].&#092;"<p>\";
  52. }
  53. ?>


Bazą danych jest plik tekstowy, który zawiera jeden rekord w jednej linijce. Może to być również tablica $baza[], która ma dowolną ilość elementów. Docelowo rekordy z pliku i tak umieszczone są za pomocą funkcji file() w tablicy $baza[].

Działania funkcji pasek() opisywać nie będę, ponieważ algorytm jest dosyć złożony i zależy od wielu warunków. Generalnie wszystko jest czystą matematyką. Funkcja rozbija liczbę wszystkich odpowiedzi na poszczególne składowe, a więc liczbę stron, aktualną pozycję czy ilość cyfr w menu. Obliczenia są uzależnione od wielu czynników i warunków początkowych.

Ważne aby do funkcji pasek() przekazać pięć zmiennych:

$l_odp - liczba wszystkich rekordów w bazie/tablicy (możliwych odpowiedzi)

$l_odp_nastronie - liczba rekordów na jednej stronie

$l_odp_napasku - liczba cyfr na pasku - wystarczy podać tylko połowę planowanej liczby zwiększonej o jeden, np. 5 to w rzeczywistości 11 cyfr (1,2,3,4,5),6,(7,8,9,10,11). Określa ona ilość cyfr po prawej i lewej stronie względem środka.

$skrypt - nazwa skryptu bez parametrów np. index.php? lub z dodatkowymi parametrami index.php?x=123&c=sort&

$a - zmienna określająca numer strony z wynikami - to właśnie ona określa, która porcja wyników będzie pokazana

Warto poeksperymentować z różnymi opcjami aby dostować skrypt do własnych potrzeb. Opcje są bardzo elastyczne i z powodzeniem można skrypt zastosować do dowolnych projektów.

Funkcja pasek() tak na prawdę nie porcjuje wyników... Tworzy ona jedynie pasek do nawigacji pomiędzy stronami z wynikami i ustala zmienną $a. Właściwe porcjowanie zachodzi na etapie pokazywania zawartości pliku lub tablicy. Cały plik wczytywany jest do tablicy i następnie jej fragment pokazywany jest na ekranie za pomocą pętli for() z podanymi zakresami rekordów.

Liczbę odpowiedzi przypadających na stronę podajemy pod funkcją pasek(), ustalamy tam również liczbę cyfr na pasku i skrypt (oraz ewentualne parametry jakie ma przekazywać). Brakuje jeszcze ilości wszystkich rekordów. Można ją pobrać za pomocą funkcji count(). Jeżeli liczba rekordów w tablicy nie zmienia się, możesz tą wartość przypisać na stałe.

Następnie wyświetlany jest pasek nawigacyjny i wybrana porcja wyników. Kolejność może być dowolna - najpierw porcja wyników, a na dole pasek nawigacyjny.

Jak widzisz, bez problemu można w ten sposób przeglądać pliki i tablice o tysiącach linijek/rekordów. Wszystko odbywa się szybko i bardzo wygodnie dla użytkownika.

p.s: nie sprawdzałem
Gość_Marek
Działa pięknie.
Ale teraz, kiedy mam w pliku txt kilka linijek, to rzbija mi to na osobne rekordy.
Co w takim przypadku?
Dla wyjaśnienia: robię stronkę z wizytówkami i chcę, żeby wyświetlało mi po 5 wizytówek na stronie. Zapisuję to w pliku txt. Każda wizytówka to kilka linii.
Jak to podzielić żeby wynik był taki jak zamierzam?

Z góry dzięki
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.