Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/txt] skomplikowana wyszukiwarka
Forum PHP.pl > Forum > PHP
alogator
Witajcie!
Zwracam się z prośbą o pomoc.
Chciałbym napisać wyszukiwarkę, ktora wyszukuje w pliku tekstowym wyrażenia i zwraca cały wiersz w którym się ono znajduje.
Wszystko oparte na pliku txt

Struktura jednego wiersza wygląda tak
imie | nazwisko | telefon | mail

Jak dopisać żeby można było określic kryterium wyszukiwania czyli np. imie, nazwisko, tel, mail?

Prosze o wskazówki
erix
Najpierw sobie rozbij pierwszy wiersz po znaku separatora (w funkcjach string znajdziesz to, czego Ci trzeba), wynik potraktuj array_flip.

Potem iterując po każdym wierszu (również rozbijając) sprawdzasz sobie kluczem pola (indeksy zwróci Ci z tej pierwszej tablicy).
Pilsener
Dam Ci trochę kodu:
  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. $licznik++;
  4. $linia = rtrim(fgets($uchwyt));
  5. //tu dasz kod wyszukujący
  6. if($znaleziono){ //ze znalezionych wierszy tworzysz tablicę
  7. $znalezione_wiersze[] = $linia;
  8. }
  9. }
  10. fclose($uchwyt);
  11. print_r($indeksy);
- tak parsujesz plik.

Jak coś wyszukać w wierszu pliku?
1. Rozbijasz go funkcją explode wg | i używasz instrukcji list - otrzymujesz zgrabną tablicę asocjacyjną przechowującą wiersz pliku.
2. Nie wiem jak to ma wyszukiwać - dokładne dopasowanie, fragment, a może wyrażenie regularne? Przy dokładnym dopasowaniu robisz:
  1. if($kryteria[$klucz] == $wiersz_pliku[$klucz]){
  2. $znalezione_wiersze[] = $linia;
  3. }
- $klucz to np. imie, nazwisko, mail etc. Spróbuj sam coś napisać.
alogator
kod wyszukujący czyli zwykły formularz?
I drugie pytanko
$pliczek ma być zmienną do pliku któy przeszukujemy tak ? np $pliczek =file("praca.txt");
Pilsener
Jak chcesz się poduczyć, to w manualu masz opis wszystkich funkcji:
http://pl.php.net/manual/pl/function.fopen.php - plus praktyczne przykłady.
File wczytuje plik do tablicy, fopen "otwiera" plik, jako parametr przyjmując ścieżkę:
  1. $handle = fopen("c:\\data\\info.txt", "r");

Poczytaj też o tablicach, bo to są podstawy pracy z PHP. Daj w kodzie:
  1. $kryteria['mail'] = 'adres@mail';
i spróbuj wyszukać w pliku samemu korzystając z w 90% gotowego kodu, jaki podałem.
alogator
Znalazłem pewien kodzik gdzieś na forum i przerobiłem go troche pod siebie i fajnie śmiga - jedyny problem to taki że szuka tylko po jednym kryterium
  1. <?php
  2. $pole1 = trim($_POST['pole1']);
  3. echo '<form action="" method="post">
  4. <center><strong>Szukany Zwrot: </strong><center>
  5. <input type="text" name="pole1" style="width: 130px;" /><br /> <br />
  6. <input type="submit" value="Szukaj" />
  7. <br />
  8. <br />
  9. <hr>
  10. </form>';
  11. $arrFile = file( 'baza.txt' );
  12. for( $i = 0; $i < count( $arrFile ); $i++ )
  13. {
  14. list($imie[$i], $nazwisko[$i], $album[$i],$tytul_pracyrw[$i],$tytul_promo[$i],$imie_promo[$i],$nazwisko_promo[$i],$s1[$i],$s2[$i],$s3[$i],$s4[$i],$s5[$i],$s6[$i],$s7[$i] ) = explode("||", $arrFile[$i]);
  15. $line = explode( '||', $arrFile[ $i ] );
  16. if( eregi( $pole1, $line[1])||eregi( $pole1, $line[0] )||eregi( $pole1, $line[2] )||eregi( $pole1, $line[3] )||eregi( $pole1, $line[4] )||eregi( $pole1, $line[5] )||eregi( $pole1, $line[6] )||eregi( $pole1, $line[7] )||eregi( $pole1, $line[8] )||eregi( $pole1, $line[9] )||eregi( $pole1, $line[10] )||eregi( $pole1, $line[11] )||eregi( $pole1, $line[12] )||eregi( $pole1, $line[13] )||eregi( $pole1, $line[14] ) )
  17. {
  18. echo"$pole1<br>";
  19. echo"$line[0]<br>";
  20. echo"$line[1]<br>";
  21. echo"$line[2]<br>";
  22. $nazwa="baza.txt";
  23. $konfiguracja = file_get_contents($nazwa);
  24. $conf=explode("||",$konfiguracja);
  25. echo"<form action='' method='POST'>
  26. <strong>Imię: </strong>$imie[$i],
  27. <strong>Nazwisko: </strong>$nazwisko[$i]
  28. <strong>Album: </strong>$album[$i]
  29. <strong>Tytuł pracy: </strong>$tytul_pracy[$i]
  30. <strong>Tytuł promotora: </strong>$tytul_promo[$i]
  31. <strong>Imię promotora: </strong>$imie_promo[$i]
  32. <strong>nazwisko promotora: </strong>$nazwisko_promo[$i]<br>
  33. <strong>Słowo kluczowe 1: </strong>$s1[$i]<br>
  34. <strong>Słowo kluczowe 2: </strong>$s2[$i]<br>
  35. <strong>Słowo kluczowe 3: </strong>$s3[$i]<br>
  36. <strong>Słowo kluczowe 4: </strong>$s4[$i]<br>
  37. <strong>Słowo kluczowe 5: </strong>$s5[$i]<br>
  38. <strong>Słowo kluczowe 6: </strong>$s6[$i]<br>
  39. <strong>Słowo kluczowe 7: </strong>$s7[$i]
  40. <hr>";
  41.  
  42. }
  43. else { ; }
  44. }
  45. ?>
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  


Jak dorzucić mu drugie kryterium aby można było wyszukać np i nazwisko i imię i żeby wyświetlał tylko te wiersze w których znajdzie imie i nazwisko ?
Pilsener
Ten kod jest do niczego, możesz mieć problem przy większym pliku lub na hostingu z mniejszym limitem pamięci i po co eregi dla każdego elementu tablicy jak szukamy jednego wyrażenia pasującego do wzorca?
Jak masz np. kryteria szukania:
  1. $kryteria['mail'] = 'abc@xyz';
  2. $kryteria['nazwisko'] = 'Kowalski';


I identyczną tablicę zawierającą poszczególne dane z pliku to żaden problem. Pytanie tylko jak to ma szukać?
- czy jeśli mail będzie się zgadzał a nazwisko nie to ma taki rekord wyszukać?
- czy jeśli ktoś poda tylko fragment maila to też ma wyszukać?

Nie napisałeś nawet dokładnie jak to ma działać i spróbuj coś zrobić samemu, dostałeś gotowy kod pobierający linie z pliku + zestaw funkcji jakich masz użyć, wrzucasz linie z pliku do tablicy:
  1. list($dane['mail'],$dane['nazwisko']) = explode("||",$linia);
(następna wskazówka dla Ciebie). Pozostaje tylko sprawdzić, czy tablica kryteria oraz dane zawierają elementy wspólne, jeśli tak to zapisujesz linię z pliku do innej tablicy i potem wyświetlasz.
alogator
fragmenty tez ma znajdywać.
Weekend idę będe kombinował smile.gif


zrobiłem tak :
ale w ogóle sie to kupy nie trzyma - w zasadzie posklejałem kod od ciebie
  1. $pliczek=file( 'baza.txt' );
  2.  
  3. $kryteria['mail'] = 'abc@xyz';
  4. $kryteria['nazwisko'] = 'Kowalski';
  5. list($dane['mail'],$dane['nazwisko']) = explode("||",$linia);
  6.  
  7.  
  8. echo"$dane[$mail]";
  9.  
  10. echo"<br>$linia<br>";
  11. echo"<br>$dane<br>";
  12. echo"$album";
  13.  
  14. $uchwyt = fopen($pliczek,'r');
  15. while(!feof($uchwyt)){
  16. $licznik++;
  17. $linia = rtrim(fgets($uchwyt));
  18.  
  19. if($kryteria[$klucz] == $wiersz_pliku[$klucz])
  20. {
  21. $znalezione_wiersze[] = $linia;
  22. }
  23.  
  24.  
  25.  
  26. if($znaleziono){
  27. $znalezione_wiersze[] = $linia;
  28. }
  29. }
  30. fclose($uchwyt);
  31. print_r($indeksy);
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  

Pilsener
Znasz w ogóle podstawy PHP?
  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. $linia = rtrim(fgets($uchwyt));
  4. echo $linia.'<br />';
  5. }
- tak wyświetlasz plik linia po linii, masz wyświetlić tylko te linie, które spełniają określone warunki, żeby to sprawdzić musisz zrobić z linii pliku tablicę:

  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. $linia = rtrim(fgets($uchwyt));
  4. list($dane['mail'],$dane['nazwisko'],$dane['tutaj_pozostale_tak_jak_leca_w_pliku']) = explode("||",$linia);
  5. }


- teraz w tablicy $dane masz całą linijkę pliku, tablica składa się z elementów, a każdy element to para klucz-wartość. Pozostaje sprawdzić, czy określony fragment tablicy $dane zawiera fragment tablicy $kryteria. Najlepiej zrobić to w pętli foreach:
  1. foreach($kryteria as $klucz => $wartosc){
  2. if(strstr($dane[$klucz],$wartosc)){
  3. //tu co ma zrobić, jeśli znajdzie
  4. }
  5. }
- pętla obróci się tyle razy, ile jest kryteriów szukania (czyli elementów tablicy kryteria) i za każdym obrotem funkcja strstr sprawdzi, czy podany szukany ciąg występuje w tablicy dane pod odpowiednim kluczem.

Wystarczy umieścić to w odpowiednim miejscu pętli i dodać kod, który wykona określoną akcję po znalezieniu pasujących elementów. Poczytaj choć kurs podstawowy PHP, bo inaczej nigdy się nie dogadamy. I dalej nie wiem, czy jeśli kryteria są dwa to ma zwrócić wiersze zawierające oba, czy jedno z tych kryteriów.
alogator
Pilsener dziękuje za cierpliwość.
Z php nie za bardzo sie znam - poszerzam wiedze - proszę o wyrozumiałość - każdy sie kiedyś uczył smile.gif

Wysypuje mi się już na samej próbie wyświetlenia calości pliku
  1. $uchwyt = fopen("baza.txt","r");
  2. while(!feof($uchwyt))
  3. {
  4. $linia = rtrim(fgets($uchwyt));
  5. }
  6.  
  7. echo "$linia";
  8.  


Gdzie tu popełniam błąd ?
Pilsener
Musisz dać echo wewnątrz pętli, pętla obróci się tyle razy, ile jest wierszy w pliku. I nie musisz dawać "" w echo. I co to znaczy wysypuje się? Opisuj zawsze dokładnie problem.
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.