Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]wyszukiwarka, w momencie gdy pusty forularz ładuje sie pusta strona a nie komunikat
Forum PHP.pl > Forum > Przedszkole
anka_skakanka
Witam, zrobiłam wyszukiwarkę na bazie typu INNOdb a więc bez full-textu.. W momencie gdy kliknę w przycisk "szukaj" są opcje:
1. wprowadzono słowo, jest w bazie --> wyświetla je
2. wprowadzono słowo, nie ma w bazie --> komunikat
3. nic nie wprowadozno --> komunikat
No i w tym momencie 1wsze opcje działają a 3cia sie sypie tzn. zamisat komunikatu "w celu korzystania z wyszukiwarki treba coś wpisać" pojawia sie pusta strona ... wszytsko działa dobrze dopóki nie jest podpięte do diva ...
w pliku index. php mam formularz
  1. <div id="left">
  2. <h3> Wyszukiwarka </h3>
  3. <!--menu po lewej - wyszukiwarka-->
  4. <ul>
  5. <form name="form1" method="get" action="index.php?wyszukaj&">
  6. <input type="hidden" name="wyszukaj" value="TRUE" />
  7. <input type="text" name="wyszukaj" size="20">
  8. <input type="submit" name="Submit" value="Szukaj">
  9. (itd)
  10. if ($_GET["wyszukaj"])
  11. {include("szukaj.php"); }
  12. </form>
  13. </ul>
  14. <br>


w pliku szukaj php
  1. <body>
  2. <h2>Wyniki wyszukiwania</h2>
  3. <?php
  4. // program wyszukiwarki - SZUKAJ.php
  5. if (($_GET['wyszukaj'])) {
  6. $szukaj =$_GET['wyszukaj'];
  7. $szukaj=trim($_GET['wyszukaj']); // usunięcie niepotrzebnych spacji
  8. // sprawdzenie, czy użytkownik cokolwiek wpisał
  9. if ($szukaj!= &#8216;’{ // if ($szukaj!= ‘’) {
  10. include("config.php"); // połączenie z bazą danych
  11. /* Like - pozwala wyszukać dany ciąg w bazie danych % - symbolizuje dowolny inny ciąg znaków
  12. or pozwoli wyszukiwać usługę w nazwie */
  13. $pytanie_p = mysql_query("Select * From uslugi Where nazwa_uslugi Like '%".$szukaj."%'")
  14. or die ('błąd zapytania'); // zapytanie do bazy
  15. $liczba_rekordow = mysql_num_rows($pytanie_p);
  16. if ($liczba_rekordow==0) {
  17. echo "Brak wyników dla wyszukianej frazy ".$szukaj."";
  18. }
  19. else {
  20. echo "Wyszukiwanie znalazło ".$liczba_rekordow." pasujących wyników
  21. do szukanego wyrażenia <strong>".$szukaj." </strong><br><br>";
  22. echo "<table cellpadding=\"2\" border=1>";
  23. print ('<tr>');
  24. print ('<th>Nazwa usługi</th>'); print ('<th>Opis usługi</th>'); print('<th> Cena w zakładzie</th>');
  25. print ('</tr>');
  26. while($rekord_p = mysql_fetch_array($pytanie_p))
  27. {
  28. echo "<tr>";
  29. echo "<td>".$rekord_p['nazwa_uslugi']."</td>";
  30. echo "<td>".$rekord_p['opis_uslugi']."</td>";
  31. echo "<td>".$rekord_p['cena_w_zakladzie']."</td>";
  32. print ('</tr>');
  33. } //koniec while
  34. print ('</table>');
  35. } //koniec else wyszukiwanych fraz
  36. }
  37. } //konief if getwyszukaj
  38. else {
  39. echo "Należy coś wpisac by skorzystać z wyszukiwarki!";
  40. }
  41. ?>

Są jakieś pomysły na rozwiązanie ?
sadistic_son
Linijke 10 z formularza zamień na to:
  1. if(isset($_GET['Submit']))

Linijke 5 z szukaj.php na to:
  1. if(isset($_GET['wyszukaj']))

Linijke 9 z szukaj.php na to:
  1. if($szukaj!='')


Generalnie to wyjaśnij co ta linijka 9 oznacza? Co TO:
  1. if ($szukaj!= &#8216;’{ // if ($szukaj!= ‘’) {
w ogóle jest? Zobacz już co sam forumowy parser zrobił z tym fragmentem.

Tłumaczę czemu Tobie to nie działało. W index.php w linijce 10 sprawdzasz czy wpisano tekst do pola wyszukaj. Przynajmniej zakładam, że taki był Twój zamiar. Jeśli wpisano to załączasz szukaj.php, jeśli nie to nie robisz nic. W szukaj.php znów sprawdzasz czy istnieje wartość pola wyszukaj, jeśli tak to 2 pierwsze przypadki Ci działają, natomiast 3 nie ma prawa działać bo w ogóle się plik szukaj.php nie wykona jeśli nie wpisano tekstu do tego pola (bo nie będzie include). Dlatego moje poprawki zmienią działanie kodu na taki: sprawdzamy czy kliknięto przycisk wysyłania forma, jeśli tak to includujemy szukaj.php. Następnie sprawdzamy czy jest ustawione pole wyszukaj, jeśli tak to zachodzą 2 pierwsze przypadki a jeśli jest puste to trzeci.

I na koniec... 1) Radziłbym użyć metody POST zamiast GET. 2) Skrypt masz zupełnie niezabezpieczony przed sql injection, użyj przynajmniej mysql_real_escape_string albo addslashes.
anka_skakanka
Cytat
(..) I na koniec... 1) Radziłbym użyć metody POST zamiast GET. 2) Skrypt masz zupełnie niezabezpieczony przed sql injection, użyj przynajmniej mysql_real_escape_string albo addslashes.

odnośnie linijki 9.. wlasnie dlatego zamiescilam w komentarzu // szukaj!='' o jak wkleilam to powstawialo te spacje.. dodam ze w formularzu mam ''
1. POST użyłam wcześniej .. zamieszczony fragment był z kopi-kopii-kopiowanej pliku smile.gif..dlatego nie zauważyłam że zamieściłam z GET...
2. właśnie z tym mam problem, jak mam formularz rejestracja, kontakt , logowania to też użyć tego? i jak potem wyciągam dane z bazy to trzeba jakoś to odszyfrowywac ?..
zamieszczam poniżej wyszukiwarkę sprawną

CODE

<body>
<h2>Wyniki wyszukiwania</h2>
<?php
// program wyszukiwarki - SZUKAJ.php

if (($_POST['wyszukaj'])) {

$szukaj =$_POST['wyszukaj'];

if ($szukaj!= '') { // sprawdzenie, czy użytkownik cokolwiek wpisał

$szukaj=trim($szukaj); // usunięcie niepotrzebnych spacji
$wyniki=mysql_real_escape_string($wyniki);

$wyniki=explode(" ",$szukaj);


$warunki=" (nazwa_uslugi LIKE '%$wyniki[0]%' )";
for ($i=1;$i<count($wyniki);$i++) {
$warunki.=" and (nazwa_uslugi LIKE '%$wyniki[$i]%' )";
}


// połączenie z bazą danych
include("config.php");
/* Like - pozwala wyszukać dany ciąg w bazie danych % - symbolizuje dowolny inny ciąg znaków
or pozwoli wyszukiwać usługę w nazwie i opisie usługi */
$pytanie_p = mysql_query("Select * From uslugi Where $warunki") or die('Invalid query: ' . mysql_error());
// zapytanie do bazy
$liczba_rekordow = mysql_num_rows($pytanie_p);
if ($liczba_rekordow==0) {
echo "<br><p>Brak wyników dla wyszukianej frazy <strong>".$szukaj." </strong> </p>";
}
else {
echo " <br><p>Wyszukiwanie znalazło ".$liczba_rekordow." pasujących wyników
do szukanego wyrażenia <strong>".$szukaj." </strong> </p><br>";
echo "<table cellpadding=\"2\">";
print ('<tr>');
print ('<th>Nazwa usługi</th>'); print ('<th>Opis usługi</th>');
print('<th> Cena w zakładzie</th>');
print ('</tr>');
while($rekord_p = mysql_fetch_array($pytanie_p))
{
echo "<tr>";
echo "<td>".$rekord_p['nazwa_uslugi']."</td>";
echo "<td>".$rekord_p['opis_uslugi']."</td>";
echo "<td>".$rekord_p['cena_w_zakladzie']."</td>";
print ('</tr>');
} //koniec while
print ('</table>');

} //koniec else wyszukiwanych fraz
}}
else {
echo "<br><p>Należy coś wpisać by skorzystać z wyszukiwarki! </p>";

}


?>

ps. formularz tak jak poprzednio tylkozamiana get na post
sadistic_son
Umieść ten powyższy kod w znacznikach forumowych php a nie code.

W tym kodzie znów stosujesz:
  1. if (($_POST['wyszukaj'])) {
Zainteresuje się funkcjami isset oraz empty i popraw to tak jak Ci podałem w pierwszym poście.

Aby zabezpieczyć się przed sql injection każde dane trafiając z formularza do bazy powinny zostać przepuszczone przez mysql_real_escape_string . Czyli dla powyższego przykładu tuż przed użyciem zmiennej $szukaj w zapytaniu robisz takie coś:
  1. $szukaj=mysql_real_escape_string($szukaj);

anka_skakanka
Cytat(sadistic_son @ 18.03.2011, 15:26:58 ) *
Umieść ten powyższy kod w znacznikach forumowych php a nie code.
W tym kodzie znów stosujesz:
  1. if (($_POST['wyszukaj'])) {
Zainteresuje się funkcjami isset oraz empty i popraw to tak jak Ci podałem w pierwszym poście.

Aby zabezpieczyć się przed sql injection każde dane trafiając z formularza do bazy powinny zostać przepuszczone przez mysql_real_escape_string . Czyli dla powyższego przykładu tuż przed użyciem zmiennej $szukaj w zapytaniu robisz takie coś:
  1. $szukaj=mysql_real_escape_string($szukaj);

1. isset nie stosowałam bo nie wyskoczył mi komunikat... teraz wiem że musiałam przesunąc kllamrę }...
2. isset empty zmienna sesyjna istnieje, zmienna pusta, na necie nawet gdzies jest to opisane wraz z przykładami co która pokazuje w momenatch null, 0 itd.. 3.
  1. $szukaj =$_POST['wyszukaj'];
  2.  
  3. if ($szukaj!= '') { // sprawdzenie, czy użytkownik cokolwiek wpisał
  4.  
  5. $szukaj=trim($szukaj); // usunięcie niepotrzebnych spacji
  6. $wyniki=mysql_real_escape_string($wyniki);
  7.  
  8. $wyniki=explode(" ",$szukaj);
czyli te mysql_real_escape_string może być w tym miejscu czy jeszcze wcześniej ?
sadistic_son
Z formularza przyjmujesz $_POST['wyszukaj'] i zapisujesz do $szukaj, więc to ta zmienna powinna być potraktowana mysql_real_escape_string.
Cytat(sadistic_son @ 18.03.2011, 15:26:58 ) *
Czyli dla powyższego przykładu tuż przed użyciem zmiennej $szukaj w zapytaniu robisz takie coś...
Co jest niezrozumiełego w tym zdaniu?

Dalej.... zmienna $wyniki jest tablicą po przypisaniu do niej wyników z explode. Nie możesz jej wrzucić do zapytania.

Poza tym po co w formularzu masz 2 pola o tej samej nazwie wyszukaj? I tak tylko jedno zostanie wysłane, tzn wartość pierwszego zostanie nadpisana wartością drugiego.

Cytat(anka_skakanka @ 18.03.2011, 15:50:55 ) *
czyli te mysql_real_escape_string może być w tym miejscu czy jeszcze wcześniej ?
Ma być jak najbliżej zmiennej odebranej z forma, której używasz w zapytaniu do bazy.
anka_skakanka
Cytat(sadistic_son @ 18.03.2011, 16:30:23 ) *
Dalej.... zmienna $wyniki jest tablicą po przypisaniu do niej wyników z explode. Nie możesz jej wrzucić do zapytania.

faktycznie zamotałam się ...
O co chodzi z tym wynikiem z explode?
index.php
  1.  
  2. <h3> Wyszukiwarka </h3>
  3. <ul>
  4. <form name="form1" method="post" action="index.php?wyszukaj&">
  5. <input type="text" name="wyszukaj" size="20">
  6. <input type="submit" name="Submit" value="Szukaj">
  7. </form>
  8. </ul>
  9. (.....)
  10. if ($_POST["Submit"])
  11. {include("szukaj.php"); }

szukaj.php
  1. <h2>Wyniki wyszukiwania</h2>
  2. <?php
  3. if (isset($_POST['wyszukaj'])) {
  4. $szukaj =$_POST['wyszukaj'];
  5. $szukaj=mysql_real_escape_string($szukaj);
  6. $szukaj=trim($szukaj);
  7. if ($szukaj!= '') { // sprawdzenie, czy użytkownik cokolwiek wpisał
  8.  
  9. $wyniki=explode(" ",$szukaj);
  10. $warunki=" (nazwa_uslugi LIKE '%$wyniki[0]%' )";
  11.  
  12. for ($i=1;$i<count($wyniki);$i++) {
  13. $warunki.=" and (nazwa_uslugi LIKE '%$wyniki[$i]%' )";
  14. }
  15. include("config.php"); // połączenie z bazą danych
  16. $pytanie_p = mysql_query("Select * From uslugi Where $warunki") or die('Invalid query: ' . mysql_error());
  17. $liczba_rekordow = mysql_num_rows($pytanie_p);
  18. if ($liczba_rekordow==0) {
  19. echo "<br><p>Brak wyników dla wyszukianej frazy <strong>".$szukaj." </strong> </p>";
  20. }
  21. else {
  22. echo " <br><p>Wyszukiwanie znalazło ".$liczba_rekordow." pasujących wyników
  23. do szukanego wyrażenia <strong>".$szukaj." </strong> </p><br>";
  24. echo "<table cellpadding=\"2\">";
  25. print ('<tr>');
  26. print ('<th>Nazwa usługi</th>'); print ('<th>Opis usługi</th>'); print('<th> Cena w zakładzie</th>');
  27. print ('</tr>');
  28. while($rekord_p = mysql_fetch_array($pytanie_p)) {
  29. echo "<tr>";
  30. echo "<td>".$rekord_p['nazwa_uslugi']."</td>";
  31. echo "<td>".$rekord_p['opis_uslugi']."</td>";
  32. echo "<td>".$rekord_p['cena_w_zakladzie']."</td>";
  33. print ('</tr>');
  34. } //koniec while
  35. print ('</table>');
  36. } //koniec else wyszukiwanych fraz
  37. }
  38. else {
  39. echo "<br><p>Należy coś wpisać by skorzystać z wyszukiwarki! </p>";
  40. }
  41. }
  42. ?>
sadistic_son
Co ma robić ta wyszukiwarka jeśli wpiszę np. ala kot pies?
1) Ma szukać wszystkich rekordów zawierających słowa ala, kot i pies?
2) Ma szukać wszystkich rekordów zawierających przynajmniej jedno z tych słow?
3) Ma szukać wszystkich rekordów zawierających ciąg ala kot pies?

Które? 1,2 lub 3?

Linijki 5 i 6 zamień miejscami w szukaj.php i obie przenieś do linijki 8. Co ma być w zmiennej $wyniki itd. napisze jak mi odpowiesz na powyższe pytanie.
anka_skakanka
Cytat(sadistic_son @ 18.03.2011, 18:57:39 ) *
Co ma robić ta wyszukiwarka jeśli wpiszę np. ala kot pies?
1) Ma szukać wszystkich rekordów zawierających słowa ala, kot i pies?
2) Ma szukać wszystkich rekordów zawierających przynajmniej jedno z tych słow?
3) Ma szukać wszystkich rekordów zawierających ciąg ala kot pies?

czy można to napisac tak :
  1. $szukaj=trim(mysql_real_escape_string($szukaj));
?... bo w jakimś skrypcie znalazłam tak
  1. $stare_haslo = md5(mysql_real_escape_string (trim($_POST['stare_haslo'])));

Jak dostąd wpisałam np mycie modelowanie --> to wychodził mi rekord idealnie w to pasujący.. ale opcja 2 by mi bardziej pasowała .. jak dobrze to rozumiem to pwoinno mi przy ciagu męskie strzyżenie odszukać wszystkie rekordy które mają słowo strzyżenie lub męskie ..
sadistic_son
Tak, hasła do bazy wysyła się zahashowane algorytmem np. md5. Nie radzę tego robić z pozostałymi danymi wink.gif Jak raz coś przepuścisz przez md5 lub sha1 to już tego nie odszyfrujesz.

Cytat
ak dobrze to rozumiem to pwoinno mi przy ciagu męskie strzyżenie odszukać wszystkie rekordy które mają słowo strzyżenie lub męskie ..
Dobrze rozumiesz, teraz tak to zadziała:
  1. <h2>Wyniki wyszukiwania</h2>
  2. <?php
  3. if (isset($_POST['wyszukaj'])) {
  4. $szukaj =$_POST['wyszukaj'];
  5.  
  6. if ($szukaj!= '') { // sprawdzenie, czy użytkownik cokolwiek wpisał
  7.  
  8.  
  9. $szukaj=mysql_real_escape_string(trim($szukaj));
  10.  
  11. $wyniki=explode(" ",$szukaj);
  12. $warunki=" (nazwa_uslugi LIKE '%$wyniki[0]%' )";
  13.  
  14. for ($i=1;$i<count($wyniki);$i++) {
  15. $warunki.=" OR (nazwa_uslugi LIKE '%$wyniki[$i]%') ";
  16. }
  17. include("config.php"); // połączenie z bazą danych
  18. $pytanie_p = mysql_query("Select * From uslugi Where $warunki") or die('Invalid query: ' . mysql_error());
  19. $liczba_rekordow = mysql_num_rows($pytanie_p);
  20. if ($liczba_rekordow==0) {
  21. echo "<br><p>Brak wyników dla wyszukianej frazy <strong>".$szukaj." </strong> </p>";
  22. }
  23. else {
  24. echo " <br><p>Wyszukiwanie znalazło ".$liczba_rekordow." pasujących wyników
  25. do szukanego wyrażenia <strong>".$szukaj." </strong> </p><br>";
  26. echo "<table cellpadding=\"2\">";
  27. print ('<tr>');
  28. print ('<th>Nazwa usługi</th>'); print ('<th>Opis usługi</th>'); print('<th> Cena w zakładzie</th>');
  29. print ('</tr>');
  30. while($rekord_p = mysql_fetch_array($pytanie_p)) {
  31. echo "<tr>";
  32. echo "<td>".$rekord_p['nazwa_uslugi']."</td>";
  33. echo "<td>".$rekord_p['opis_uslugi']."</td>";
  34. echo "<td>".$rekord_p['cena_w_zakladzie']."</td>";
  35. print ('</tr>');
  36. } //koniec while
  37. print ('</table>');
  38. } //koniec else wyszukiwanych fraz
  39. }
  40. else {
  41. echo "<br><p>Należy coś wpisać by skorzystać z wyszukiwarki! </p>";
  42. }
  43. }
  44. ?>
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.