Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wyszukiwarka co to umie wyświetlać dane z bazy SQL. Proszę o pomoc
APW
post 17.11.2009, 15:13:37
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Witam, próbuję uruchomić wyszukiwarkę bazy SQL. Ponieważ znam tylko HTML, mam ogromne problemy z dopasowaniem odnalezionego w internecie skryptu do własnych potrzeb. Dużo skorzystałem z zawartych na tym forum różnych informacji, ale zatrzymałem się w pewnym momencie i nie wiem jak rozwikłać ową zagwozdkę. Moja baza składa się z kilku tabel (na razie dwóch o nazwach misie i lale - poniżej), z których za pomocą przedstawionego niżej formularza chciałbym wyszukiwać konkretne dane.


A to kod formularza
Kod
<form action="search.php" method="post">
  <p>Nazwa produktu:
    <input type="text" name="phrase" />
    Typ:
    <input type="checkbox" name="a" value="a">
    A
    <input type="checkbox" name="b" value="b">
    B
    <input type="checkbox" name="c" value="c">
    C </p>
  <p>Cena od:
    <input type="text" name="cena1">
    do
    <input type="text" name="cena2">
    <input type="submit" value="Szukaj!" />
  </p>
</form>


Tutaj kod skryptu PHP, który szuka i wyświetla
  1. <?php
  2. // program wyszukiwarki - search.php
  3. // wyświetlenie nagłówka
  4. echo'<h2>Wyniki wyszukiwania</h2>';
  5. // usunięcie niepotrzebnych białych znaków
  6. $_POST['phrase']=trim($_POST['phrase']);
  7. // sprawdzenie, czy użytkownik wpisał dane
  8. if(empty($_POST['phrase']))
  9. // jeśli nie, to wyświetl komunikat i zakończ działanie skryptu
  10. die('Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!');
  11. // jeśli jednak dane są wpisane poprawnie
  12. else
  13. {
  14. // połączenie z bazą danych, NIE ZAPOMINJ USTAWIĆ WŁASNYCH DANYCH!
  15. $base=mysqli_connect('xxx','xxx','xxx','xxx');
  16. // skonstruowanie zapytania
  17. // zwróć uwagę na operator Like - to on jest sercem całej aplikacji. Pozwala wyszukać dany ciąg w bazie danych
  18. // jak zapewne zauważyłeś, przed frazą i po niej umieszczam znaki procenta %
  19. // ten znak symbolizuje dowolny inny ciąg znaków, więc jest niezbędny do skutecznego wyszukiwania
  20. // połaczenie operatorem Or pozwala na wyszukiwanie danego ciągu zarówno w nazwie, jak i opisie produktu
  21. // UWAGA! Tutaj też nie zapomnij ustawić swoich danych!
  22. $query="Select nazwa, typ, cena, magazyn From misie Where nazwa Like '%{$_POST['phrase']}%'";
  23. // wysłanie zapytania do bazy danych
  24. $result=mysqli_query($base,$query);
  25. // ustalenie ilości wyszukanych obiektów
  26. $obAmount=mysqli_num_rows($result);
  27. // wyswietlenie ilości wyszukanych obiektów
  28. echo'Znaleziono: '.$obAmount.'<br /><br />';
  29. echo '<table border="0" align="center" cellpadding="2" cellspacing="0">
  30. <tr><td align="center" width="100"><font color="#FFCC00">NAZWA</font></td>
  31. <td align="center" width="100"><font color="#FFCC00">TYP</font></td>
  32. <td align="center" width="50"><font color="#FFCC00">CENA</font></td>
  33. <td align="center" width="70"><font color="#FFCC00">MAGAZYN</font></td></tr>';
  34. // wyświetlenie wyników w pętli
  35. for($x=0;$x<$obAmount;$x++)
  36. {
  37. // przekształcenie danych na tablicę
  38. $row=mysqli_fetch_assoc($result);
  39.  
  40. // wyświetlenie nazwy produktu
  41. echo '<tr><td>'.$row['nazwa'].'</td>
  42. <td>'.$row['typ'].'</td>
  43. <td align="center">'.$row['cena'].'</td>
  44. <td align="center">'.$row['magazyn'].'</td>
  45. </tr>';
  46. }
  47. }
  48. // zamknięcie połączenia
  49. mysqli_close($base);
  50. echo '</table>';
  51. // koniec aplikacji
  52. ?>

Moje problemy są takie:
1. Jak zrobić, żeby dane były wyszukiwane we wszystkich tabelach w bazie. Dopisanie po przecinku nazwy drugiej tabeli powoduje błąd.
2. A na tym mi najbardziej zależy: Czy da się zrobić (jak?) żeby skrypt wyszukiwał również na podstawie ceny, po wpisaniu do formularza kwot granicznych, żeby znalazł przedmioty o cenach pomiędzy tymi wpisanymi.
3. Nie udało mi się też wprowadzić warunku wyszukiwania wg typu (A-B-C). Żeby np. przy zaznaczonej opcji A i C znalazł tylko produkty tego typu. Nie wiem jak to zrobić.

Poproszę o jakieś porady, wskazówki...
Go to the top of the page
+Quote Post
darko
post 17.11.2009, 15:26:49
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Popróbuj coś według poniższych zapytań:

1.
  1. $query="select misie.*, lale.* from misie, lale where misie.nazwa like '%{$_POST['phrase']}%' and lale.nazwa like '%{$_POST['phrase']}%'";


2.
  1. $query="select misie.*, lale.* from misie, lale where misie.cena between $min and $max and lale.cena between $min and $max";


3. musisz połączyć warunki wyszukiwania z punktu 1.i 2., sprawdzić w jakiej konfiguracji wybrano typ (abc, ab, ac, bc, cb) i analogicznie sformułować odpowiednie zapytanie do bazy.

Ten post edytował darko 17.11.2009, 15:29:42


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
APW
post 18.11.2009, 10:21:14
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Zacząłem od punktu 1 ale niestety nie udało się. Po pierwsze Zmieniłem wyszukiwanie z pola "nazwa" na pole "magazyn" albowiem chciałem sprawdzić czy będą się wyświetlały dane z obu tabel. Podstawiłem zasugerowany przez darko kod w ten sposób :
  1. $query="select misie.*, lale.* from misie, lale where misie.magazyn like '%{$_POST['phrase']}%' and lale.magazyn like '%{$_POST['phrase']}%'";

Wyszukiwarka napisała, że znaleziono jakieś rekordy, ale nic się nie wyświetlało (dlaczego?), więc wpisałem wszystkie nazwy pól w ten sposób:
  1. $query="select misie.nazwa, misie.typ, misie.cena, misie.magazyn, lale.nazwa, lale.typ, lale.cena, lale.magazyn from misie, lale where misie.magazyn like '%{$_POST['phrase']}%' and lale.magazyn like '%{$_POST['phrase']}%'";

I okazało się, że znajduje i wyświetla rekordy ale tylko z jednej tabeli (lale) i to tylko te, w których nazwa magazynu powtarza się i w drugiej tabeli (misie) i dodatkowo wyświetla te rekordy podwójnie. Natomiast jeśli nazwa z pola magazyny nie powtarza się w tabeli misie (np. Katowice), wtedy nie znajduje niczego.
Nie umiem sobie z tym poradzić. Podobnie jest z punktem 2. Za trzeci w ogóle się nie brałem, bo to chyba dla mnie za trudne.
Więc moja prośba o pomoc jest nadal aktualna...
Go to the top of the page
+Quote Post
Vardamir
post 18.11.2009, 10:54:59
Post #4





Grupa: Zarejestrowani
Postów: 14
Pomógł: 2
Dołączył: 27.10.2009
Skąd: Kalwaria Zebrzydowska / Kraków

Ostrzeżenie: (0%)
-----


Bo w WHERE masz "and", zamień go na "or".

Poza tym spróbuj wypisywać rekordy whilem:

  1. while ($row=mysql_fetch_assoc($result))
  2. {
  3.  
  4. }


No i masz literówkę w mysqli_fetch_assoc .

Ten post edytował Vardamir 18.11.2009, 10:55:50
Go to the top of the page
+Quote Post
APW
post 18.11.2009, 12:03:39
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Jeśli usunę literkę "i" to wtedy wyświetlają się jakieś błędy, więc chyba musi już tak zostać jak jest.
Jeśli dodam "while" to wszystko wyświetla się bez zmian czyli tak samo jak bez tego słówka.
Natomiast jeśli zmienię "and' na "or":
  1. $query="select misie.nazwa, misie.typ, misie.cena, misie.magazyn, lale.nazwa, lale.typ, lale.cena, lale.magazyn from misie, lale where misie.magazyn like '%{$_POST['phrase']}%' or lale.magazyn like '%{$_POST['phrase']}%'";

to nadal wyświetla tylko rekordy z tabeli lale, ale za to w jeszcze bardziej dziwny sposób - jeśli wpiszę w formularzu nazwę magazynu, która występuje tylko w tabeli misie - wtedy wyświetlają mi się wszystkie rekordy z tabeli lale. A jeśli wpiszę nazwę z tabeli lale to wtedy rekordy zawierające tę nazwę wyświetlają się 6-krotnie, a pozostałe 2-krotnie. Więc w wynikach wyszukiwania mogę mieć nawet 20 elementów, choć wszystkich rekordów w obu bazach jest tylko 12...
Go to the top of the page
+Quote Post
Vardamir
post 18.11.2009, 14:57:47
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 2
Dołączył: 27.10.2009
Skąd: Kalwaria Zebrzydowska / Kraków

Ostrzeżenie: (0%)
-----


A tak, nie zauważyłem że łączysz się przez mysqli, a nie myslq, a takie zapytanie? (średnik powinien być na końcu zapytania)

  1. $query="SELECT misie.nazwa, misie.typ, misie.cena, misie.magazyn, lale.nazwa, lale.typ, lale.cena, lale.magazyn FROM misie, lale WHERE misie.magazyn=$_POST['phrase'] or lale.magazyn=$_POST['phrase'];";


i spróbuj wyświetlić za pomocą:
  1. while ($row=mysqli_fetch_array($result))
  2. {
  3. if ($row[0]!="")
  4. {
  5. echo $row[0]." - "$row[1]; //jeżeli jest to mis
  6. }
  7. else if ($row[4]!="")
  8. {
  9. echo $row[4]." - "$row[5]; //jeżeli jest to mis
  10. }
  11. }

Go to the top of the page
+Quote Post
APW
post 18.11.2009, 15:41:29
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Vardamir, wstawienie zaproponowanego stringu "$query="SELECT misie.nazwa........" powoduje błąd w tej właśnie linii: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /search.php on line 25.
Niestety mam za małą wiedzę, żeby zrozumieć co jest źle a także by pojąć przedstawiony jeszcze przez ciebie sposób wyświetlania i nie wiem, co miałbym tam zmienić czy dostawić, względnie w którym miejscu, żeby mi się wyświetlały dane...

Do tej pory udało mi się rozwiązać dzięki waszej pomocy i materiałów na tym forum problemy z punktu 2 i 3 - oczywiście tylko w odniesieniu do jednej tabeli - wtedy wszystko działa bez zarzutu. Pozostał tylko ten problem z wyszukiwaniem i wyświetlaniem rezultatów z wielu tabel (wszystkich w bazie - w tym wypadku z dwóch).
Go to the top of the page
+Quote Post
Vardamir
post 18.11.2009, 15:49:44
Post #8





Grupa: Zarejestrowani
Postów: 14
Pomógł: 2
Dołączył: 27.10.2009
Skąd: Kalwaria Zebrzydowska / Kraków

Ostrzeżenie: (0%)
-----


Przepraszam, bez apostrofów przy zmiennych POST.

Wklej tego while i zobaczy czy Ci coś wypluje.

Działa on na zasadzie, że dopóki znajduje rekord, wykonuje instrukcje i przechodzi do następnego rekordu, sprawdza go, wykonuje instrukcje. I tak aż skończą się rekordy. Natomiast mysqli_fetch_array tworzy tablice gdzie w twoim przypadku pod indexem [0] znajduje się misie.nazwa, pod indeksem [1] -> misie.typ i tak dalej. Możliwe że błednie wyświetla Ci rekordy przy mysqli_fetch_assoc gdyż masz dwie kolumny 'nazwa'.
Go to the top of the page
+Quote Post
APW
post 18.11.2009, 16:06:10
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Usunąłem apostrofy i jest teraz tak:
  1. $query="SELECT misie.nazwa, misie.typ, misie.cena, misie.magazyn, lale.nazwa, lale.typ, lale.cena, lale.magazyn FROM misie, lale WHERE misie.magazyn=$_POST[phrase] or lale.magazyn=$_POST[phrase];";
A końcówka skryptu z częścią o wyświetlaniu - po zmianie na proponowaną - wygląda tak:


Niestety znowu coś nie działa: Parse error: syntax error, unexpected T_VARIABLE, expecting ',' or ';' in /search.php on line 43
Go to the top of the page
+Quote Post
Vardamir
post 18.11.2009, 16:10:09
Post #10





Grupa: Zarejestrowani
Postów: 14
Pomógł: 2
Dołączył: 27.10.2009
Skąd: Kalwaria Zebrzydowska / Kraków

Ostrzeżenie: (0%)
-----


kropki przed $row[1] i $row[5]
Go to the top of the page
+Quote Post
APW
post 18.11.2009, 19:22:37
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


2 kropki dostawione, ale wtedy: Parse error: syntax error, unexpected $end in /search.php on line 54
Go to the top of the page
+Quote Post
Meares
post 18.11.2009, 19:59:47
Post #12





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Sugerując się powyższym kodem (tzn. zdjęciem kodu) - brak średnika, po "echo '</table>'".

Ten post edytował Meares 18.11.2009, 20:00:26


--------------------
manual mmocenter
Nie pomagam na PW!
Go to the top of the page
+Quote Post
APW
post 19.11.2009, 10:07:54
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 17.11.2009

Ostrzeżenie: (0%)
-----


Średnik dostawiłem, ale komunikat wyświetla się ten sam...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.05.2025 - 08:21