Skocz do zawartości

[PHP]Efektywny skrypt wyszukiwania w formularzu


dj.drezyna

Polecane posty

Problem polega na tym, że chcąc zrobić wyszukiwarkę z dwoma polami typu tekst trzeba podać cztery ify bo musi być:

  • dwie mają null
  • dwie mają wartości
  • pierwsza ma wartość druga null
  • druga ma wartość pierwsza null
No a jak ma się trzy pola to jest osiem kombinacji no a z czterema to lepiej nie wiedzieć...

 

Dlatego chciałem się spytać czy jest bardziej efektywny sposób robienia wyszukiwania czy możliwe jest nie sprawdzanie w ifach wszystkich kombinacji (możliwości). Jeżeli ktoś wie jak to zrobić to bardzo bym był wdzięczny no prosiłbym o króciutki przykład użycia.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

a po co dwa pola? czym się będą różnić? Jeśli każde robi taką samą funkcję to wystarczy, że zrobisz dla jednego czy ma wartość null czy wartość i pętlą wywoływać metodę. Jeśli chcesz aby wyszukiwało słów to zamiast mieć jeden edit na każde słowo lepiej mieć w sumie jeden edit, a potem funkcję Explode (php) rozdzielić np. po przecinkach

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Chyba mnie Force nie zrozumiałeś. Chodzi mi o to że ja nie rozdzielam wcale pól o tej samej zawartości na styl: jedno pole: ,,Kolorowy kapelusz'' na dwa edity ,,Kolorowy'' i ,,kapelusz'' tylko chodzi mi o to, że każde z pól edit zawierają inne dane które ja chcę połączyć tak by w rezultacie wyszukania znalazły się rekordy posiadające razem ,,Kolorowy'' i/oraz ,,kapelusz''. Przy czym Kolorowy i kapelusz stanowią dane znajdujące się w dwóch kolumnach ponieważ Kolorowy odnosi się np do dresu a kapelusz do stroju wyjściowego.

Przepraszam za podany przykład ale nie mogłem jakoś wymyślić prostszego :)

Wyjaśnienie:

Mój admin nie pozwolił mi korzystać z bazy danych dlatego musiałem to obejść w ten sposób że jest plik Spis_.csv który zawiera wszystkie dane elementów wyświetlanych w wyszukiwaniu. Stąd wszystkie operacje są wykonywane w klamrach pętli Foreach. Stąd wszystko wygląda mniej więcej tak:

 

 
$flaga = 0;
$spisglobalny = fopen ('Spis_.csv', "r");
$spisglobalny = file('Spis_.csv');
foreach ($spisglobalny as $linia) {
$osobne = explode(';', $linia);
$datyr = explode("-", $osobne[7]);
$daty = implode("", $datyr);
$miasto = $_GET['miejsce'];

(...)

if (($osobne[8] == $miasto) and ($stacja == null) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) {
$wyszuk = 1001;
}
if (($osobne[8] == $miasto) and ($osobne[9] == $stacja) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) {
$wyszuk = 1101;
}

(...)

switch ($wyszuk):
case 1001:
if (($osobne[8] == $miasto) and ($stacja == null) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) { { include 'Galera.php'; } }
break;
case 1101:
if (($osobne[8] == $miasto) and ($osobne[9] == $stacja) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) { { include 'Galera.php'; } }
break;

(...)

endswitch;
}
if ($flaga != 1)
{
echo '<tr><td><p class="nc">Niestety  adna z fotografii nie pasuje do kryteri w wszukiwania.</p></td></tr>';
}

 

No i moja prośba o ,,ratunek'' jest taka by nie tworzyć ręcznie ciągle gdy dołoże polę edit czy inne casów składających się z co raz większej liczby cyfr o wartościach 0 bądź 1 wpisanych przeze mnie niestety ręcznie (można się pomylić a poza tym to ich przybywa w postępie geometrycznym co zniechęca skutecnie do tego by cokolwiek z opcji dla użytkownika dokładać, a chciałoby się...).

 

Dziękuję z zapoznanie się z tak dlugim postem!

Przepraszam że nie odpisałem wcześniej.

 

pozdrawiam,

dj.drezyna

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

traktuje zmienną $wyszuk jako stringa :)

to jest "uproszczenie" dla pierwszych if'ów tych przed switch

a te if'y w case są niepotrzebne

 

 

zapomniałem o apostrofach powinno być $wyszuk ="0000"; itd....

 

edit:

 

może wyjaśnię ci mój tok rozumowania :)

twoje if'y wyglądają następująco(posłużę się tym pierwszym)

jeśli element tej tablicy jest równy miasto i stacja nie istniej i kalendarz nie istnieje i daty = $granicad to wyszuk = 1001

(wiem trochę zagmatwałem)

ja to rozbiłem na kilka if'ów

0)(to nie if) wyszuk=0000

1) jeśli element tablicy == miasto to wyszuk[0]=1 a więc wyszuk wygląda teraz tak 0001

2) jeżeli stacja nie istniej to to wyszuk[1]=0, a jeśli istnieje i jest równa osobne[9] to wyszuk[1]=1 (wyszuk wygląda tak 0011)

i tak rozpisujesz kolejne if'y

a jeśli będziesz chciał dodać kolejny warunek to tylko dopiszesz na początku kolejne 0 do wyszuk

nie wiem czy zrozumiałeś ale powinno działać

 

edit2:

teraz zauważyłem jeszcze 1 mały błąd ja zapisuje do wyszuk "odwrotnie" to znaczy jeśli ty miałeś 1101 to w moim kodzie wyjdzie 1011 ale mam nadzieje że to nie duży problem i łatwo można to naprawić :)

Link do komentarza
Udostępnij na innych stronach

Dlaczego ify w case są niepotrzebne. Jak ma to działać skoro każdy przypadek case będzie wyświetlał zawrtość include ,,galera.php'' w której nie ma żadnych warunków tylko samo wyświetlenie tabeli a konkretnie jednego wielokrotnie powtarzanego wiersza z wierszami do konkretnej foty.

 

Co daje to rozbicie na ify skoro ja dalej muszę podać wszystkie kombinacje chybaże nie rozumiem... A tym samym dlaczego ify tworzą wartość przechowywaną przez $wyszuk skoro w case one i tak muszą być przepisane chyba, że zostaną odczytane z wartości tablicy $wyszuk

 

Dodatkowo zauważyłem że ify się zazębiają czyli robi się coś takiego if(){}else{if(){}else{}} itd. To wcale nie ułatwienie?

 

Przepraszam że pewnie nie zrozumiałem ale no mówię sam do wszystkiego dochodzę i nie łatwo jest :)

Pozdro i dzięki!

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

zacznę od if'ów w case

zobacz to

if (($osobne[8] == $miasto) and ($stacja == null) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) {
$wyszuk = 1001;
} o+hŚ)ltџѹąą(ŃąŃ(ąąĄo+vŁr\"u{}}Ęhr2śł^ŹzęŁjx'z
*nŚ,&mĘ0jwjJaY
       OOLJPS
       OLJPS
       OLJPS

OLJJ^[ZI][LLLI][bY
       OOL
PS
       OLJPS
       OLJPS

OLJJ^[ZI][LLI][bY
       OOLJPS
       OL
PS
       OLJPS

OLJJ^[ZI][LLI][bY
       OOLJPS
       OLJPS
       OL
PS

OLJJ^[ZI][LLI][bBY
       OOL
PS
       OL
PS
       OL
PS

OL
J^[ZI][        ][boĘ- jHy0uŚzk9ęłjxŚ(Ź)l
tąlt)lt
ąlt)ltąlt
)ltąlt

i masz tylko 4 if'y czyli jest uproszczone :)

a te zagnieżdżone if'y służą dodatkowo sprawdzeniu czy wartość jest null

Link do komentarza
Udostępnij na innych stronach

Tak to mniej więcej zrozumiałem tylko dalej będę się upierał że nie wiem jak można zrobić tak, że ify w case są niepotrzebne skoro ify za ,,zobacz to'' służą do tego, że jak spełni się ich warunek, to zmienna $wyszuk przyjmie daną wartość i w case dalej musi być sprawdzony ten warunek, bo przecież w innym wypadku skąd instrukcja w danym przypadku case będzie wiedziała, że ma wyświetlić dane, króre spełniają te same kryteria co zaistniały by wyłonić dany $wyszuk.

Czyli chcę powiedzieć tylko, że reszta jest fajna tyleże dalej przynajmniej w caseach musi być na 4 pola 16 ifów. No ja to tak rozumiem ale jak byś mógł mi wyjasnić jak może wylądać redukcja caseów to było by super.

 

Dziękuję za czas poświęcony na rozwiązywanie tego problemu.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

dobra jeszcze raz twój kod

if (($osobne[8] == $miasto) and ($stacja == null) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) {
$wyszuk = 1001;
}
(...)
switch ($wyszuk):
case 1001:
if (($osobne[8] == $miasto) and ($stacja == null) and ($kalendarz == null) and
(($daty <= $granicag) and ($daty >= $granicad))
) { { include 'Galera.php'; } }
break;
o)ĘhŹŁ6
if(coś){$wyszuk=1001;}
(...)
switch ($wyszuk):
case 1001:if(coś){instrukcje;}
break;
o(qs<Ęź'Ę7Ź]4)ĄĘ-Ękksj7ŹŹ^-jHo)Ś+\"yĘ)6 
if($x==1){$y=0;}
(...)
if($y==0){ if($x==1){ instrukcje; }}
o'(h\"ą\"Ś){Łz6ĘaY   OLJ^OLBBY        OOL
^[ZNB

Link do komentarza
Udostępnij na innych stronach

Już chciałem podziękować ale nie działa to tak dobrze bo jak wpisuję dane do dwóch pól formularza na raz i chcę by działały jako ,,i'' to zwraca mi wynik tylko z jednego pola.

 

P.S. Jest możliwe by casów nie było na cztery pola szesnastu? Łatwo się je robi ale może można je też zredukować? Bo u mnie teraz wyglądają tak (dodatkowo kod całościowo):

 
$wyszuk = "0000";
if($miasto == null){$wyszuk[0]=0;}else{ 
if($osobne[8] == $miasto){$wyszuk[0]=1;}
}
if($stacja == null){$wyszuk[1]=0;}else{ 
if($osobne[9] == $stacja){$wyszuk[1]=1;}
}
if($kalendarz == null){$wyszuk[2]=0;}else{ 
if($osobne[7] == $kalendarz){$wyszuk[2]=1;}
}
if(($rok_od == null) and ($rok_do == null) and ($miesiac_od == null) and ($miesiac_do == null) and ($dzien_od == null) and ($dzien_do == null)){$wyszuk[3]=0;}else{ 
if(($daty <= $granicag) and ($daty >= $granicad)){$wyszuk[3]=1;}
}
switch ($wyszuk):
case 1011: { include 'Galera.php'; } break;
case 1111: { include 'Galera.php'; } break;
case 0111: { include 'Galera.php'; } break;
case 0011: { include 'Galera.php'; } break;
case 1001: { include 'Galera.php'; } break;
case 1101: { include 'Galera.php'; } break;
case 0101: { include 'Galera.php'; } break;
case 0001: { include 'Galera.php'; } break;
case 1010: { include 'Galera.php'; } break;
case 1110: { include 'Galera.php'; } break;
case 0110: { include 'Galera.php'; } break;
case 0010: { include 'Galera.php'; } break;
case 1000: { include 'Galera.php'; } break;
case 1100: { include 'Galera.php'; } break;
case 0100: { include 'Galera.php'; } break;
(...)

Dlaczego tak się dzieje i co zrobić by przy uzupełnieniu kilku pól wynik był rezultatem działania operatora ,,i''.

Trzeba też pamiętać że wszystko u mnie dzieje się w pętli foreach.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

trudno powiedzieć

spróbuj dać prze switch echo $wyszuk; i zobaczymy co da w wyniku

 

i tak parze na ten kod i myślę że można by jeszcze zamiast switch dać takie coś

if($wyszuk == "1111" or $wyszuk == "0111"){include 'Galera.php';}

 

a co do tej 16

pasz 4 pola które mogą przyjmować dwa rodzaje wartości null lub coś innego, czyli liczba kombinacji to 4^2=16 :) a przynajmniej tak mi się wydaje

Link do komentarza
Udostępnij na innych stronach

Wiesz co? Korzyść z Twojej propozycji jest taka że na cztery pola nie muszę dawać 32 ifów tylko 16 (na pięć zamiast 64 32 (nie liczę tych które sprawdzają czy zero czy jeden)) bo przy case i tak musi być odpowiedni warunek (if) no bo inaczej tego nie mogę zrozumieć i wykonać bo Twoja propozycja okazała się niewystarczająca by wpisywać dane w kilku polach i brać ich wartości jednocześnie w rezultacie wyszukiwania.

 

Jak masz jakiś pomysł na to by to było wykonalne w Twoim wariancie to bym się bardzo ucieszył.

 

P.S. Echo dało rezultat taki, że przy każdym wierszu czytanego pliku pojawił się 0000 a gdy dany wiersz zawierał danę z pierwszego pola to dał 1000 a gdy wypełniło się dwa pola pierwsze i dany wiersz zawierał równe dane to wynik był 1100 czyli to zadziałało prawidłowo tylko tyle że nie brało pod uwagę oczekiwanego iloczynu operatora and (którego zresztą nie było nigdzie i nie wiadomo jak go wpleść do Twoje propozycji nie zwiększająć za dużo ifów).

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

dobra spróbuje coś wymyślić tylko powiedz mi czy dobrze zrozumiałem Twój kod

jak się domyśliłem to zmienne $miasto, $stacja itd. to wartości z editów

i coś czego nie rozumiem

dlaczego tak na dobrą sprawę jeśli wyszuk jest różny od 0000 to dajesz include Galera.php ?? może problem jest w tym pliku Galera.php ??

 

------------

edit:

po przemyśleniu sprawy przyszło mi głowy pewne rozwiązanie

wczytujesz całą bazę do zmiennej tablicowej i robisz coś takiego:

foreach($tablica as $key => $x){
if($tablica[$key][0]!=$zmienna1){unset($tablica[$key]);}
if($tablica[$key][1]!=$zmienna2){unset($tablica[$key]);}
}

o coś takiego chodziło ??

w rezultacie otrzymasz tablice w której pole 0 zawsze będzie równe zmiennej 1 a pole 1 zawsze będzie równe zmiennej 2

kod pisałem "z palca" więc mogą być jakieś błędy

Link do komentarza
Udostępnij na innych stronach

Według prośby Galera.php w całej krasie :):

<?php
echo '<form action="Fota.php" method="GET">';
echo '<tr>'."\n".'<td rowspan="3" style="width: 20%"><p>';
echo '<a href="'.'Fota.php?fota='."$osobne[1]".'">';
echo '<img src="'.'Foteczki/'."$osobne[0]".'/'."$osobne[1]".'.jpg" alt="'."$osobne[1]".'jpg" /></a></p></td>'."\n";
echo '<td colspan="2" style="width: 60%"><p>Opis:</p></td>'."\n";
echo '<td style="width: 20%"><p>Autor:</p></td>'."\n".'</tr>'."\n";
echo '<tr>'."\n".'<td colspan="2" style="width: 60%"><p>'."$osobne[5]".'</p></td>'."\n";
echo '<td style="width: 20%"><p>'."$osobne[10]".'</p></td>'."\n".'</tr>'."\n".'<tr>'."\n";
echo '<td><p>Data:<br />'."$osobne[7]".'</p></td>'."\n".'<td><p>Miejscowość:<br />'."$osobne[8]".'</p></td>'."\n";
echo '<td><p></p></td>'."\n".'</tr>'."\n".'<tr>'."\n".'<td><p>kB</p></td>'."\n".'<td colspan="2"><p></p></td>'."\n";
echo '<td rowspan="2"><p></p></td>'."\n".'</tr>'."\n".'<tr>'."\n";
echo '<td colspan="3"><p>Stacja/Przystanek: '."$osobne[9]".'</p></td>'."\n";
echo '</tr>'."\n".'<tr><td colspan="4"><p></p></td></tr><tr><td colspan="4"><p></p></td></tr>';
echo '</form>';
$flaga = 1;

To powinno wyjaśnić pewne kwestie bo jak widać plik ten korzysta i opiera się całkowicie na pętli foreach.

 

Gdyby zmienna wyszuk zawierała wartość 0000 to wyświetlone byłyby wszystkie zdjęcia bez jakichkolwiek kryteriów.

 

Rozwiązanie z przekonwertowaniem to do tabeli jest dla mnie nie zrozumiałe bo Galera.php by w ogóle nie zadziałała. Chyba że nie rozumiem tego trybu postępowania...

 

Jak działa skrypt w jego wcześniejszej wersji tj. z ogromną liczbą ifów jest pod adresem: http://213.184.18.130/~djd/Gal/Szukaj.php

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

1) korzystasz z takiego wynalazku jak validator html ??

2) w galerii nie jest potrzebny form

3) może trochę mało eleganckie ale powinno działać

 
foreach($tablica as $key => $x){
if($tablica[$key][0]!=$zmienna1){unset($tablica[$key]);}
if($tablica[$key][1]!=$zmienna2){unset($tablica[$key]);}
}
foreach($tablica as $key => $x){
$osobie[8]=$x[8];
include 'Galera.php';
(...)
}

a swoją drogą przydało by się tu użyć jakichś szablonów

Link do komentarza
Udostępnij na innych stronach

Chciałbym przypomnieć, że u mnie nie ma tablicy tylko pętla ją tworzy z wierszy pliku:

$flaga = 0;
$spisglobalny = fopen ('Spis_.csv', "r");
$spisglobalny = file('Spis_.csv');
foreach ($spisglobalny as $linia) {
$osobne = explode(';', $linia);
$datyr = explode("-", $osobne[7]);
$daty = implode("", $datyr);
$miasto = $_GET['miejsce']; //(...)

(...) }

 

Co do tego co przesłałeś mi na pocztę nic nie rozumiem i wydaje mi się że ten problem nie jest do rozwiązania na poziomie php jaki ja reprezentuję i będę musiał ciężko pracować by uwijać się przy nieefektywnym dla mnie i dla serwera sposobie 32 ifów na pięć pól jednak bardzo dziękuję za ten sposób z podmienianiem wartości w $wyszuk to i tak duży postęp.

 

To co podałeś w kodzie źródłowym na ostatnim poście to nie wiem czy można to zastosować do tego przypadku co na początku tego postu jest opisywany.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

switch ($wyszuk):

case 1011: { include 'Galera.php'; } break;

case 1111: { include 'Galera.php'; } break;

case 0111: { include 'Galera.php'; } break;

case 0011: { include 'Galera.php'; } break;

case 1001: { include 'Galera.php'; } break;

case 1101: { include 'Galera.php'; } break;

case 0101: { include 'Galera.php'; } break;

case 0001: { include 'Galera.php'; } break;

case 1010: { include 'Galera.php'; } break;

case 1110: { include 'Galera.php'; } break;

case 0110: { include 'Galera.php'; } break;

case 0010: { include 'Galera.php'; } break;

case 1000: { include 'Galera.php'; } break;

case 1100: { include 'Galera.php'; } break;

case 0100: { include 'Galera.php'; } break;

(...)

 

 

tak troszke nie za bardzo w temacie jestem ale po co sie daje switch'a skoro i tak kazdy case robi to samo?

Link do komentarza
Udostępnij na innych stronach

Dzięki dopiero ten post dał mi do myślenia i rzeczywiście switch nic tu nie robi serwer mniej się napracuje jeżeli będzie miał tylko same zestawy warunków w ifach a dla czytelności w komentarzu będę miał napisane np 1010 żeby wiedzieć od razu które pole ma true a która null.

 

Dobrze czyli teraz wrócono prawie do punktu wyjścia bo teraz dokładnie cztery pola to 15 ifów bo (2^(liczba pól))-1 bo jak już mówiłem nie potrzebuję a nawet nie chciałbym sytuacji kiedy pokazałyby się wszystkie zdjęcia bo im węższe kryterium tym lepiej bo podziału na strony jeszcze nie opracowałem i niedobrze jak na jedynej stronie jest za dużo zdjęć ale to już materiał na inny temat co zresztą nie jest takie ważne dla mnie jak na razie.

i pomyśle jeszcze nad innym rozwiązaniem
Bardzo się cieszę i dziękuję za to!

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

pisane "z palca"

if(($osobie[8]==$miasto)AND( ($stacja == null) OR ($stacja == $osobie[9] )) AND (($kalendarz == null) OR($kalendarz == $osobie[ileś])) AND (($daty <= $granicag) and ($daty >= $granicad))) {include "Galera.php";}

mam nadzieje że zadziała :)

Link do komentarza
Udostępnij na innych stronach

Niestety nie zadziałało. Wynikiem dowolnego wyszukiwania było ciągle to samo, czyli wszytkie rekordy i nie ma się co dziwić, bo przecież każde pole puste to null, a ponieważ wszędzie była alternatywa, to zawsze skryptowi było wszystko jedno - jednym słowem zawsze sobie szedł na łatwiznę i brał nieuzupełnione pola jako prawidłowe tymczasem, te rekordy wcale nie powinny się znaleźć w rezultatach wyszukiwania.

 

Dziękuję jednak z podjętą próbę rozwiązania tego problemu. Jestem tylko ciekawy jak wygląda skrypt wygenerowany przez CMS-y w których to możliwe jest zrobienie wyszukiwarki z dziesiątkami pól. Jakie wtedy muszą być długie ify i czy w ogóle się je robi, bo jest inna technika?

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...