![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Mam problem z napisaniem zaawansowanej wyszukiwarki. Formularz wygląda tak:
Mianowicie wszystko komplikuje się dla mnie, ponieważ użytkownik może wybrać pole "Wszystkie". I co wtedy zrobić? Sprawa byłaby prostsza bez tego czyli jedno zapytanie gdzie coś=coś i szukaj. Ale może wybrać np. miasto warszawa a dalej już "Wszystkie", "Wszystkie", "Wszystkie" etc. Jak to wyszukać? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 290 Pomógł: 48 Dołączył: 11.05.2008 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Wystarczą odpowiednie warunki - nic skomplikowanego (IMG:style_emoticons/default/smile.gif)
Jeśli użytkownik wybrał opcję "Wszystkie" - nie dodajemy nic do zapytania. W przeciwnym wypadku dodajemy te "coś=coś" (IMG:style_emoticons/default/wink.gif) Przykładowo (wiadomo, musisz zadbać o odpowiednie filtrowanie danych itd.):
PS: Pamiętaj, żeby nadać atrybut "value" dla znaczników option. Ten post edytował Tajgeer 9.08.2013, 16:57:20 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Dodam jeszcze, że w przypadku ceny możesz użyć BETWEEN i w przypadku wszystkie dać zapytanie typu
SELECT ... BETWEEN 0 AND 1000000 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Czyli mniej więcej coś takiego (przykład)
? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 290 Pomógł: 48 Dołączył: 11.05.2008 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Nie, nie możesz wstawić do zapytania warunku z pustym parametrem. Wiesz jak wyglądałoby zapytanie, gdyby ktoś wybrał wszystkie?
Gwarantuję, że to nie zadziała, a chyba chodzi o to, aby działało (IMG:style_emoticons/default/wink.gif) Przyjrzyj się uważniej mojemu poprzedniemu wpisowi. Polecam również, abyś zrezygnował z mysql_*, chociażby na rzecz PDO. Ten post edytował Tajgeer 9.08.2013, 17:05:28 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Edytytowałeś post jak akurat pisałem i nie zauważyłem (IMG:style_emoticons/default/smile.gif)
Więc dla każdego selecta muszę stworzyć warunek i przypisać mu odpowiednią wartość? |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 290 Pomógł: 48 Dołączył: 11.05.2008 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
W skrócie? Tak.
Na więcej podpowiedzi już nie licz. (IMG:style_emoticons/default/wink.gif) Ten post edytował Tajgeer 9.08.2013, 17:11:21 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem (IMG:style_emoticons/default/smile.gif)
Kolejne pytanko na inny temat. Mam <form action="index.php?page=szukaj" method="get"> Gdy klikam submit otrzymuję jednak inny adres. Mianowicie: BieżącaStrona.php?miasto=Wszystkie&typ_ofert=Wszystkie etc. Czemu nie jest index.php?page=szukaj&miasto=Wszystkie&typ_ofert=Wszystkie ? Korzystam z includowania:
Ten post edytował TursoN 9.08.2013, 17:15:46 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 290 Pomógł: 48 Dołączył: 11.05.2008 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Spróbuj zmienić link w parametrze action (IMG:style_emoticons/default/wink.gif)
Dodatkowo, możesz usunąć z tamtego miejsca "?page=szukaj" i skorzystać z ukrytego inputa, żeby przekazać ten parametr. Ten post edytował Tajgeer 9.08.2013, 17:22:04 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Action jest dobre, bo chcę by szukało na podstronie ?page=szukaj
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 290 Pomógł: 48 Dołączył: 11.05.2008 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Tak jak wspomniałem, action możesz ustawić na zwykłe "/index.php", czy po prostu na "/". Jeśli z użyciem ukrytego inputa przekażesz parametr "page" - wszystko będzie działać tak, jak należy.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Możesz podać przykład kodu, bo jakoś nie za bardzo rozumiem?
Coś nie działa to wyszukiwanie :/
Raz działa raz nie, ale raczej nie. Wezmę typ oferty=sprzedaż => Brak wyników (choć istnieje) Wezmę typ oferty=wynajem => znajduje Wezmę Kraków, wynajem => You have an error in your SQL syntax (choć istnieje) Nie wiem jak zaradzić Ten post edytował TursoN 9.08.2013, 19:01:10 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Zauważ co dzieje się w warunkach.
Raz masz dobre zapytanie typu SELECT * FROM xx WHERE asd=asd a za chwilę możesz mieć SELECT * FROM xx WHERE asd=asd WHERE dsa=dsa WHERE sda=sda... Drugie już nie jest poprawne. Na szybko mógłbyś zliczać ile jest wybranych selectów różnych od "wszystkie", jeżeli więcej niż 1, to kolejne warunki dodajesz z AND czyli w tym przypadku miałbyś SELECT * FROM xx WHERE asd=asd AND dsa=dsa AND sda=sda Czaisz o co chodzi? Ten post edytował Szymciosek 9.08.2013, 21:27:11 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Napisałem obliczanie GETów różnych od "wszystkie".
Nie wiem co dalej. Niby wystarczyłoby dopisać AND na początku albo końcu każdego $condition, ale nie wiadomo przecież, który z nich będzie w zapytaniu pierwszy albo ostatni... Ten post edytował TursoN 13.08.2013, 19:03:37 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Jeszcze źle.
Nie będę podpowiadał za dużo, ale spróbuj najpierw zrobić na jednym polu, gdzie masz SELECT * FROM tableName WHERE columnName = selectValue to jest prostsza wersja. Teraz spróbuj do tego dodać żeby rozróżniał 2 warunki: Tutaj może być albo WHERE albo AND Wiesz na pewno, że przy wyborze pierwszego selecta, który jest różny od "wszystkie" dodajesz do warunki WHERE, w każdym kolejnym dodajesz już AND i AND itd... Przy dodawaniu AND musisz oczywiście sprawdzać czy poprzednie selecty są różne od "wszystkie", bo jeżeli masz wybrane "wszystkie", to wtedy do zapytania nie dodajesz nic i pobierasz wszystkie rekordy czyli: SELECT * FROM tableName Pisz, jeżeli jeszcze są jakieś niejasności, ja z ciekawości tego zadania sam zrobiłem taką wyszukiwarkę na podstawie danych: name, country, city, capital, employees Dodatkowo chcę do tego dodać możliwość dodawania kolejny pól, edycji istniejących oraz dodawanie nowych rekordów do bazy itd.... |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Rozkminiam nad tym bardzo długo i to chyba przekracza jak na razie moje logiczne myślenie.
Widzę wiele niejasności. $condition jest ciągiem, który zawiera dalszą część zapytania. W jaki sposób mam tam dodać AND |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Raz musisz dodać WHERE, a raz AND, musisz wymyślić tylko kiedy.
Z tego co wrzuciłeś, to jesteś już coraz bliżej poprawnego rozwiązania, ale popatrz na to spokojnie, zacznij od jednego selecta, później dodaj drugi. Warunek mniej więcej powinien wyglądać tak:
To jest zapytanie dla dwóch selectów. Na początku jest tworzone podstawowe zapytanie, które zwróci mi WSZYSTKIE DANE. W pierwszym warunku ($country) jest sprawdzane czy wartość selecta jest różna od ANY, jeżeli jest, to do $query dodaję, WHERE, analogicznie w drugą stronę, jest równe ANY - nie wchodzi do warunku i zapytanie zostaje w podstawowej formie. Drugi warunek sprawdza to samo dla $city, ale bierze pod uwagę jeszcze wartość z poprzedniego selecta. Jeżeli poprzedni był ANY, to znaczy, że nie zostało nic dodane i trzeba zacząć z WHERE, jeżeli był różny od ANY, to znaczy, że już jest coś wybrane i Ty musisz tylko dodać AND... |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Napisałem krótki przykład wg. Twojego kodu i dziwnie działa... Np. wybiorę łódź to nic nie ma a powinno, a jak wybiorę gdańsk to jest.
Przykładowo dla Łodzi jest zapytanie: SELECT * FROM ogloszenia WHERE miasto='łódź' No i czemu nie znajduje? (IMG:http://iv.pl/images/42928843339027408137.jpg) To Łódź mimo krzaków... Jak zmienię w adresie $_GET["miasto"] łódź na Łódź to nagle znajduje, a dla krakowa nawet z małej litery
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 455 Pomógł: 49 Dołączył: 12.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Co do problemu z miastem Łódź to zaradziłem po prostu zmienijąc value w select tak, że zaczynają się z wielkiej litery.
Problem kolejny w zapytaniu: Kod SELECT * FROM ogloszenia WHERE typ_oferty='sprzedaż' Brak wyników. Powinno znaleźć 3 wyniki Ma to jakiś związek z ogonkami w bazie? Np. słowo "sprzedaż" w bazie wygląda tak: "SprzedaÅ" |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Zacznij od podstaw, czyli normalnej komunikacji z bazą danych, tj. PDO.
2. Popraw swoją bazę danych. Występowanie krzaków prędzej czy później przyczyni się do sporych problemów. Wątek był poruszany dosłownie setki razy. Podpowiedź: baza danych powinna mieć ustawione domyślne kodowanie znaków na UTF8, połączenie Skrypt <--> Baza Danych musi mieć ustawione kodowanie UTF8 (parametr charset w DNS-ie PDO), pliki PHP powinieneś mieć zapisane jako UTF8 i na koniec najważniejsze: strona powinna być serwowana w kodowaniu UTF8 (nagłówek Content-Type oraz element <meta charset="utf-8" />). Miej jednak na uwadze, że to zapewni jedynie poprawny zapis dla nowych danych - stare musisz albo usunąć i wgrać ponownie, albo przekonwertować (Google: MySQL ICONV). 3. Budowanie zapytania i przekazanie mu odpowiednich parametrów: wywal to co miałeś do tej pory bo to się do niczego nie nadaje. Wyjątkowo, z racji na to, że kod jest śmiesznie krótki, a opis nadzwyczaj długi dostaniesz niemal gotowca:
EDIT: 4. Jeszcze odnośnie porównywania tekstu. Tutaj MySQL wykorzystuje tzw. collatory (Google: MySQL Collations), który pozwala na traktowanie różnych znaków jako tożsamych. Np. utf8_unicode_ci zwróci prawdę w następujących przypadkach: 'a' = 'A', 'Ę' = 'é', 'ß' = 'ss'. Niestety MySQL od lat posiada buga, który niepoprawnie traktuje literę "Ł". Ten post edytował Crozin 15.08.2013, 12:40:34 |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Usunąłem wszystko w tabeli `ogloszenia` i dałem: ALTER TABLE `ogloszenia` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
W notepadzie++ mam kodowanie UTF-8 bez BOM W index.php nagłówek head: <meta http-equiv="content-type" content="text/html; charset=utf-8"> dalej krzaki |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Przecież napisałem jeszcze o kodowaniu połączenia z bazą danych.
|
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
W bazie ->krzaki Przy wyświetlaniu danych z bazy ->krzaki |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 455 Pomógł: 49 Dołączył: 12.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli wcześniej zapisałeś bez kodowania to nadal będą krzaki. Możesz jeszcze sprawdzić kodowaniie tabeli.
|
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Dałem do pustej tabeli ALTER TABLE `ogloszenia` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
Po czym sprawdzam ogloszenia->struktura i Metoda porównywania napisów=latin1_swedish_ci czyli nie zmienia się |
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zmieniłeś domyślne kodowanie dla tabeli, czyli dopiero dla nowych kolumn zostanie nadane takie kodowanie. Analogicznie sytuacja ma się w przypadku domyślnego kodowania dla bazy danych.
|
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Okej, zmieniłem ręcznie dla jednej kolumny na utf8_polish_ci i jest ok. Można jakimś poleceniem teraz zmienić dla wszystkich zamiast ręcznie po kolei?
Edit: Mam. Dla ciekawskich: ALTER TABLE nazwa_tabeli CONVERT TO CHARACTER SET utf8 COLLATE utf8_polish_ci
Kod Notice: Undefined variable: pdo in test.php on line 61 Fatal error: Call to a member function prepare() on a non-object intest.php on line 61 Nigdy PDO się nie zajmowałem, więc to jakaś magia (IMG:style_emoticons/default/wink.gif) Ten post edytował TursoN 15.08.2013, 13:36:32 |
|
|
![]()
Post
#29
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
http://php.net/manual/en/book.pdo.php - do dzieła więc. Zbyt wiele tego nie ma.
|
|
|
![]()
Post
#30
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Coś jest nie tak z ceną. Wybiorę cenę z przedziału 1-9 a np. pokaże mi także tę za 12. Jak pozostawię puste pola z ceną od oraz do, to nie znajduje nic. Jak w cenie od wpiszę 0 w w cenie do nic, to nie znajduje nic Nie wiem czemu ta cena jest niedokładna... Pomiędzy 1 a 9999999 pokaże wszystko, ale czemu pomiędzy np. 1 a 9 nie pokaże tego za 2... Odświeżam. Ten post edytował TursoN 17.08.2013, 22:43:22 |
|
|
![]()
Post
#31
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#32
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Cytat string(65) "SELECT * FROM ogloszenia WHERE cena BETWEEN :cena_od AND :cena_do" array(2) { [":cena_od"]=> string(1) "0" [":cena_do"]=> string(7) "9999999" }
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 28.09.2025 - 09:20 |