Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zaawansowana wyszkukiwarka
Forum PHP.pl > Forum > Przedszkole
Turson
Mam problem z napisaniem zaawansowanej wyszukiwarki. Formularz wygląda tak:

  1. <form action="index.php?page=szukaj" method="get">
  2. Miasto<select name="miasto">
  3. <option>Wszystkie</option>
  4. <option>Warszawa</option>
  5. <option>Łódź</option>
  6. <option>Gdańsk</option>
  7. <option>Wrocław</option>
  8. <option>Kraków</option>
  9. </select>
  10. Typ oferty<select name="typ_ofert">
  11. <option>Wszystkie</option>
  12. <option>Sprzedaż</option>
  13. <option>Kupno</option>
  14. <option>Wynajem</option>
  15. </select>
  16. Rynek<select name="rynek">
  17. <option>Wszystkie</option>
  18. <option>Wtórny</option>
  19. <option>Pierwotny</option>
  20. </select>
  21. <br />
  22. Typ nieruchomości<select name="typ_nieruchomosci">
  23. <option>Wszystkie</option>
  24. <option>Mieszkanie</option>
  25. <option>Dom</option>
  26. <option>Działka</option>
  27. </select>
  28. Rodzaj ogłoszenia<select name="rodzaj_ogloszenia">
  29. <option>Wszystkie</option>
  30. <option>Deweloperskie</option>
  31. <option>Agencyjne</option>
  32. <option>Bezpośrednie</option>
  33. </select>
  34. <br>
  35. Cena od
  36. <select name="cena_od">
  37. <option>Wszystkie</option>
  38. <option>1 000 zł</option>
  39. <option>5 000 zł</option>
  40. <option>10 000 zł</option>
  41. <option>25 000 zł</option>
  42. <option>50 000 zł</option>
  43. <option>100 000 zł</option>
  44. <option>250 000 zł</option>
  45. <option>500 000 zł</option>
  46. <option>1 000 000 zł</option>
  47. </select>
  48. do
  49. <select name="cena_do">
  50. <option>Wszystkie</option>
  51. <option>1 000 zł</option>
  52. <option>5 000 zł</option>
  53. <option>10 000 zł</option>
  54. <option>25 000 zł</option>
  55. <option>50 000 zł</option>
  56. <option>100 000 zł</option>
  57. <option>250 000 zł</option>
  58. <option>500 000 zł</option>
  59. <option>1 000 000 zł</option>
  60. </select><br />
  61. <input type="submit" class="szukaj" value="Szukaj"/>
  62. </form>


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ć?
Tajgeer
Wystarczą odpowiednie warunki - nic skomplikowanego smile.gif

Jeśli użytkownik wybrał opcję "Wszystkie" - nie dodajemy nic do zapytania. W przeciwnym wypadku dodajemy te "coś=coś" wink.gif

Przykładowo (wiadomo, musisz zadbać o odpowiednie filtrowanie danych itd.):
  1. <?php
  2. $condition = '';
  3. if ( (string) $_GET['miasto'] !== 'Wszystkie')
  4. {
  5. $condition = 'WHERE miasto = "' . $_GET['miasto'] . '"';
  6. }
  7.  
  8. $db->query('SELECT * FROM tabela ' . $condition);
  9. ?>


PS: Pamiętaj, żeby nadać atrybut "value" dla znaczników option.
Szymciosek
Dodam jeszcze, że w przypadku ceny możesz użyć BETWEEN i w przypadku wszystkie dać zapytanie typu

SELECT ... BETWEEN 0 AND 1000000
Turson
Czyli mniej więcej coś takiego (przykład)
  1. if(isset($_POST["wyslano"]))
  2. {
  3. if($_POST["miasto"]=="wszystkie") { $miasto ="";} else { $miasto = $_POST["miasto"]; }
  4. if($_POST["typ oferty"]=="wszystkie") { $typ oferty ="";} else { $typ oferty = $_POST["typ oferty"]; }
  5. // i tak dalej...
  6.  
  7. mysql_query("SELECT * from tabela WHERE miasto=$miasto AND typ_oferty=$typ oferty");


?
Tajgeer
Nie, nie możesz wstawić do zapytania warunku z pustym parametrem. Wiesz jak wyglądałoby zapytanie, gdyby ktoś wybrał wszystkie?

  1. SELECT * FROM tabela WHERE miasto= AND typ_ofert=


Gwarantuję, że to nie zadziała, a chyba chodzi o to, aby działało wink.gif Przyjrzyj się uważniej mojemu poprzedniemu wpisowi. Polecam również, abyś zrezygnował z mysql_*, chociażby na rzecz PDO.
Turson
Edytytowałeś post jak akurat pisałem i nie zauważyłem smile.gif

Więc dla każdego selecta muszę stworzyć warunek i przypisać mu odpowiednią wartość?
Tajgeer
W skrócie? Tak.

  1. <?php
  2. $condition = '';
  3. if ( (string) $_GET['miasto'] !== 'Wszystkie')
  4. {
  5. $condition .= 'WHERE miasto = "' . $_GET['miasto'] . '"';
  6. }
  7.  
  8. if ( (string) $_GET['typ_oferty'] !== 'Wszystkie')
  9. {
  10. $condition .= ' AND typ_oferty = "' . $_GET['typ_oferty'] . '"';
  11. }
  12.  
  13. $db->query('SELECT * FROM tabela ' . $condition);
  14. ?>


Na więcej podpowiedzi już nie licz. wink.gif
Turson
Rozumiem 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:

  1. $page = ((isset($_GET['page']) && $_GET['page'] != '') ? $_GET['page'] : 'index');
  2. $page=(preg_match('/(\.\.|\/)/i',$page)?'index':$page);
  3. $page = preg_replace('/[^a-zA-Z0-9 \._-]/','',$page);
  4. $page = (file_exists('include/'.$page.'.php') ? $page : 'error');
  5. include('include/'.$page.'.php');
Tajgeer
Spróbuj zmienić link w parametrze action wink.gif

Dodatkowo, możesz usunąć z tamtego miejsca "?page=szukaj" i skorzystać z ukrytego inputa, żeby przekazać ten parametr.
Turson
Action jest dobre, bo chcę by szukało na podstronie ?page=szukaj
Tajgeer
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.
Turson
Możesz podać przykład kodu, bo jakoś nie za bardzo rozumiem?


Coś nie działa to wyszukiwanie :/

  1. <form action="test.php" method="get">
  2. Miasto<select name="miasto">
  3. <option value="wszystkie">Wszystkie</option>
  4. <option value="warszawa">Warszawa</option>
  5. <option value="łódź">Łódź</option>
  6. <option value="gdańsk">Gdańsk</option>
  7. <option value="wrocław">Wrocław</option>
  8. <option value="kraków">Kraków</option>
  9. </select>
  10. Typ oferty<select name="oferta">
  11. <option value="wszystkie">Wszystkie</option>
  12. <option value="sprzedaż">Sprzedaż</option>
  13. <option value="wynajem">Wynajem</option>
  14. </select>
  15. Rynek<select name="rynek">
  16. <option value="wszystkie">Wszystkie</option>
  17. <option value="wtórny">Wtórny</option>
  18. <option value="pierwotny">Pierwotny</option>
  19. </select>
  20. <br />
  21. Typ nieruchomości<select name="nieruchomosc">
  22. <option value="wszystkie">Wszystkie</option>
  23. <option value="mieszkanie">Mieszkanie</option>
  24. <option value="dom">Dom</option>
  25. <option value="działka">Działka</option>
  26. </select>
  27. Rodzaj ogłoszenia<select name="ogloszenie">
  28. <option value="wszystkie">Wszystkie</option>
  29. <option value="deweloperskie">Deweloperskie</option>
  30. <option value="agencyjny">Agencyjne</option>
  31. <option value="bezpośrednie">Bezpośrednie</option>
  32. </select>
  33. <br>
  34.  
  35. Cena:
  36. <input type="text" maxlength="10" name="cena_od" class="form_cena" value=1>
  37. -
  38. <input type="text" maxlength="10" name="cena_do" class="form_cena" value=1>
  39.  
  40. <br />
  41. <input type="submit" class="szukaj" value="Szukaj"/>


  1. if(isset($_GET["miasto"]) && isset($_GET["oferta"]) && isset($_GET["rynek"]) && isset($_GET["nieruchomosc"]) && isset($_GET["ogloszenie"]) && isset($_GET["cena_od"]) && isset($_GET["cena_do"]))
  2. {
  3. $condition = '';
  4. if ( (string) $_GET['miasto'] !== 'wszystkie')
  5. {
  6. $condition .= 'WHERE miasto = "' . $_GET['miasto'] . '"';
  7. }
  8. if ( (string) $_GET['oferta'] !== 'wszystkie')
  9. {
  10. $condition .= 'WHERE typ_oferty = "' . $_GET['oferta'] . '"';
  11. }
  12. if ( (string) $_GET['rynek'] !== 'wszystkie')
  13. {
  14. $condition .= 'WHERE rynek = "' . $_GET['rynek'] . '"';
  15. }
  16. if ( (string) $_GET['nieruchomosc'] !== 'wszystkie')
  17. {
  18. $condition .= 'WHERE typ_nieruchomosci = "' . $_GET['nieruchomosc'] . '"';
  19. }
  20. if ( (string) $_GET['ogloszenie'] !== 'wszystkie')
  21. {
  22. $condition .= 'WHERE rodzaj_ogloszenia = "' . $_GET['ogloszenie'] . '" ';
  23. }
  24.  
  25.  
  26. $zapytanie = mysql_query('SELECT * FROM ogloszenia ' . $condition . ' ') or die(mysql_error());
  27. if(mysql_num_rows($zapytanie))
  28. {
  29.  
  30. echo 'Wyniki wyszukiwania:<br>';
  31. while($w = mysql_fetch_assoc($zapytanie))
  32. {
  33. echo '<a href="index.php?page=pokaz&id='.$w["id"].'">'.$w["tytul"].'</a><br>';
  34. }
  35. }
  36. else
  37. {
  38. echo 'Brak wyników.<br><br>';
  39. $zapytanie2 = mysql_query('SELECT * FROM ogloszenia');
  40. if(mysql_num_rows($zapytanie2))
  41. {
  42.  
  43. while($w2 = mysql_fetch_assoc($zapytanie2))
  44. {
  45. echo '<a href="index.php?page=pokaz&id='.$w2["id"].'">'.$w2["tytul"].' '.$w2["metraz"].'m2, '.$w2["cena"].'zł</a><br>';
  46. }
  47. }
  48. }
  49.  
  50. }
  51. else
  52. {
  53. echo "nic";
  54. }


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ć
Szymciosek
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?
Turson
Napisałem obliczanie GETów różnych od "wszystkie".

  1. if(isset($_GET["miasto"]) && isset($_GET["oferta"]) && isset($_GET["rynek"]) && isset($_GET["nieruchomosc"]) && isset($_GET["ogloszenie"]) && isset($_GET["cena_od"]) && isset($_GET["cena_do"]))
  2. {
  3. $w = 0;
  4. if($_GET["miasto"]!="wszystkie"){ $w++; }
  5. if($_GET["oferta"]!="wszystkie"){ $w++; }
  6. if($_GET["rynek"]!="wszystkie"){ $w++; }
  7. if($_GET["nieruchomosc"]!="wszystkie"){ $w++; }
  8. if($_GET["ogloszenie"]!="wszystkie"){ $w++; }
  9.  
  10.  
  11. $condition = '';
  12. if ( (string) $_GET['miasto'] !== 'wszystkie')
  13. {
  14. $condition .= 'miasto = "' . $_GET['miasto'] . '"';
  15. }
  16. if ( (string) $_GET['oferta'] !== 'wszystkie')
  17. {
  18. $condition .= 'typ_oferty = "' . $_GET['oferta'] . '"';
  19. }
  20. if ( (string) $_GET['rynek'] !== 'wszystkie')
  21. {
  22. $condition .= 'rynek = "' . $_GET['rynek'] . '"';
  23. }
  24. if ( (string) $_GET['nieruchomosc'] !== 'wszystkie')
  25. {
  26. $condition .= 'typ_nieruchomosci = "' . $_GET['nieruchomosc'] . '"';
  27. }
  28. if ( (string) $_GET['ogloszenie'] !== 'wszystkie')
  29. {
  30. $condition .= 'rodzaj_ogloszenia = "' . $_GET['ogloszenie'] . '" ';
  31. }
  32. global $w;
  33. if($w>1)
  34. {
  35. $zapytanie = mysql_query('SELECT * FROM ogloszenia WHERE ' . $condition . ' ') or die(mysql_error());
  36. echo $w;
  37. if(mysql_num_rows($zapytanie))
  38. {
  39.  
  40. echo 'Wyniki wyszukiwania:<br>';
  41. while($w = mysql_fetch_assoc($zapytanie))
  42. {
  43. echo '<a href="index.php?page=pokaz&id='.$w["id"].'">'.$w["tytul"].'</a><br>';
  44. }
  45. }
  46. else
  47. {
  48. echo 'Brak wyników.<br><br>';
  49. $zapytanie2 = mysql_query('SELECT * FROM ogloszenia');
  50. if(mysql_num_rows($zapytanie2))
  51. {
  52.  
  53. while($w2 = mysql_fetch_assoc($zapytanie2))
  54. {
  55. echo '<a href="index.php?page=pokaz&id='.$w2["id"].'">'.$w2["tytul"].' '.$w2["metraz"].'m2, '.$w2["cena"].'zł</a><br>';
  56. }
  57. }
  58. }
  59. }
  60.  
  61. }
  62. else
  63. {
  64. echo "nie";
  65. }


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...
Szymciosek
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....
Turson
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
Szymciosek
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:

  1. $query = 'SELECT * FROM companies';
  2.  
  3. // Country
  4. if ($country != 'Any')
  5. {
  6. $query .= " WHERE country='" . $country . "'";
  7. }
  8.  
  9. // City
  10. if ($city != 'Any')
  11. {
  12. if ($country == 'Any')
  13. {
  14. $query .= " WHERE city='" . $city . "'";
  15. }
  16. else
  17. {
  18. $query .= " AND city='" . $city . "'";
  19. }
  20. }


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...
Turson
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?

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


  1. if(isset($_GET["miasto"]) && isset($_GET["oferta"]) && isset($_GET["rynek"]) && isset($_GET["nieruchomosc"]) && isset($_GET["ogloszenie"]) && isset($_GET["cena_od"]) && isset($_GET["cena_do"]))
  2. {
  3. $w = 0;
  4. $l = count($_GET);
  5. if($_GET["miasto"]!="wszystkie"){ $w++; }
  6. if($_GET["oferta"]!="wszystkie"){ $w++; }
  7. if($_GET["rynek"]!="wszystkie"){ $w++; }
  8. if($_GET["nieruchomosc"]!="wszystkie"){ $w++; }
  9. if($_GET["ogloszenie"]!="wszystkie"){ $w++; }
  10. $miasto = $_GET["miasto"];
  11. $oferta = $_GET["oferta"];
  12. $rynek = $_GET["rynek"];
  13. $nieruchomosc = $_GET["nieruchomosc"];
  14. $ogloszenie = $_GET["ogloszenie"];
  15. $cena_od = $_GET["cena_od"];
  16. $cena_do = $_GET["cena_do"];
  17.  
  18. $query = "SELECT * FROM ogloszenia";
  19. //Miasto
  20. if ($miasto != 'wszystkie')
  21. {
  22. $query .= " WHERE miasto='" . $miasto . "'";
  23. }
  24.  
  25. //Oferta
  26. if ($oferta != 'wszystkie')
  27. {
  28. if ($miasto == 'wszystkie')
  29. {
  30. $query .= " WHERE typ_oferty='" . $oferta . "'";
  31. }
  32. else
  33. {
  34. $query .= " AND typ_oferty='" . $oferta . "'";
  35. }
  36. }
  37.  
  38. echo $query.'<br><br>';
  39. $zapytanie = mysql_query($query) or die(mysql_error());
  40. if(mysql_num_rows($zapytanie))
  41. {
  42.  
  43. echo 'Wyniki wyszukiwania:<br>';
  44. while($w = mysql_fetch_assoc($zapytanie))
  45. {
  46. echo '<a href="index.php?page=pokaz&id='.$w["id"].'">'.$w["tytul"].'</a><br>';
  47. }
  48. }
  49. else
  50. {
  51. echo 'Brak wyników.<br><br>';
  52. $zapytanie2 = mysql_query('SELECT * FROM ogloszenia');
  53. if(mysql_num_rows($zapytanie2))
  54. {
  55.  
  56. while($w2 = mysql_fetch_assoc($zapytanie2))
  57. {
  58. echo '<a href="index.php?page=pokaz&id='.$w2["id"].'">'.$w2["tytul"].' '.$w2["metraz"].'m2, '.$w2["cena"].'zł</a><br>';
  59. }
  60. }
  61. }
  62.  
  63.  
  64. }
  65. else
  66. {
  67. echo "nie";
  68. }
Turson
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Å"
Crozin
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:
  1. <?php
  2.  
  3. $parameters = array();
  4. $whereClause = array();
  5.  
  6. if ($country !== null) {
  7. $whereClause[] = 'country = :country';
  8. $parameters[':country'] = $country;
  9. }
  10.  
  11. if ($priceFrom !== null && $priceTo !== null) {
  12. $whereClause[] = 'price BETWEEN :priceFrom AND :priceTo';
  13. $parameters[':priceFrom'] = $priceFrom;
  14. $parameters[':priceTo'] = $priceTo;
  15. }
  16.  
  17. ...
  18.  
  19. $sql = sprintf('SELECT ... FROM tbl_name WHERE %s ORDER BY ...', implode(' AND ', $whereClause));
  20.  
  21. $stmt = $pdo->prepare($sql);
  22. $stmt->execute($parameters);
  23.  
  24. $results = $stmt->fetchAll();


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ę "Ł".
Turson
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
Crozin
Przecież napisałem jeszcze o kodowaniu połączenia z bazą danych.
Turson
  1. function connection() {
  2. // serwer
  3. $mysql_server = "";
  4. // admin
  5. $mysql_admin = "";
  6. // hasło
  7. $mysql_pass = "";
  8. // nazwa baza
  9. $mysql_db = "ogloszenia";
  10. // nawiązujemy połączenie z serwerem MySQL
  11. @mysql_connect($mysql_server, $mysql_admin, $mysql_pass)
  12. or die('Brak połączenia z serwerem MySQL.');
  13. // łączymy się z bazą danych
  14. @mysql_select_db($mysql_db)
  15. or die('Błąd wyboru bazy danych.');
  16. mysql_query("SET NAMES 'utf8'");
  17. }
  18. connection();

W bazie ->krzaki
Przy wyświetlaniu danych z bazy ->krzaki
mlawnik
Jeżeli wcześniej zapisałeś bez kodowania to nadal będą krzaki. Możesz jeszcze sprawdzić kodowaniie tabeli.
Turson
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ę
Crozin
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.
Turson
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

  1. $parameters = array();
  2. $whereClause = array();
  3.  
  4. if ($miasto !== null)
  5. {
  6. $whereClause[] = 'miasto = :miasto';
  7. $parameters[':miasto'] = $miasto;
  8. }
  9.  
  10. if ($cena_od !== null && $cena_do !== null)
  11. {
  12. $whereClause[] = 'price BETWEEN :cena_od AND :cena_do';
  13. $parameters[':cena_od'] = $cena_od;
  14. $parameters[':cena_do'] = $cena_do;
  15. }
  16.  
  17.  
  18. $sql = sprintf('SELECT * FROM ogloszenia WHERE %s', implode(' AND ', $whereClause));
  19.  
  20. $stmt = $pdo->prepare($sql);
  21. $stmt->execute($parameters);
  22.  
  23. $results = $stmt->fetchAll();

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 wink.gif
Crozin
http://php.net/manual/en/book.pdo.php - do dzieła więc. Zbyt wiele tego nie ma.
Turson
  1. <?php
  2. if(isset($_GET["miasto"]) && isset($_GET["oferta"]) && isset($_GET["rynek"]) && isset($_GET["nieruchomosc"]) && isset($_GET["ogloszenie"]) && isset($_GET["cena_od"]) && isset($_GET["cena_do"]))
  3. {
  4. $w = 0;
  5. $l = count($_GET);
  6. if($_GET["miasto"]!="wszystkie"){ $w++; }
  7. if($_GET["oferta"]!="wszystkie"){ $w++; }
  8. if($_GET["rynek"]!="wszystkie"){ $w++; }
  9. if($_GET["nieruchomosc"]!="wszystkie"){ $w++; }
  10. if($_GET["ogloszenie"]!="wszystkie"){ $w++; }
  11. $miasto = $_GET["miasto"];
  12. $oferta = $_GET["oferta"];
  13. $rynek = $_GET["rynek"];
  14. $nieruchomosc = $_GET["nieruchomosc"];
  15. $ogloszenie = $_GET["ogloszenie"];
  16. $cena_od = $_GET["cena_od"];
  17. $cena_do = $_GET["cena_do"];
  18.  
  19. $parameters = array();
  20. $whereClause = array();
  21.  
  22. if ($miasto !== "wszystkie")
  23. {
  24. $whereClause[] = 'miasto = :miasto';
  25. $parameters[':miasto'] = $miasto;
  26. }
  27.  
  28. if ($oferta !== "wszystkie")
  29. {
  30. $whereClause[] = 'typ_oferty = :oferta';
  31. $parameters[':oferta'] = $oferta;
  32. }
  33.  
  34. if ($rynek !== "wszystkie")
  35. {
  36. $whereClause[] = 'rynek = :rynek';
  37. $parameters[':rynek'] = $rynek;
  38. }
  39.  
  40. if ($nieruchomosc !== "wszystkie")
  41. {
  42. $whereClause[] = 'typ_nieruchomosci = :nieruchomosc';
  43. $parameters[':nieruchomosc'] = $nieruchomosc;
  44. }
  45.  
  46. if ($ogloszenie !== "wszystkie")
  47. {
  48. $whereClause[] = 'rodzaj_ogloszenia = :ogloszenie';
  49. $parameters[':ogloszenie'] = $ogloszenie;
  50. }
  51.  
  52. if ($cena_od !== "wszystkie" && $cena_do !== "wszystkie")
  53. {
  54. $whereClause[] = 'cena BETWEEN :cena_od AND :cena_do';
  55. $parameters[':cena_od'] = $cena_od;
  56. $parameters[':cena_do'] = $cena_do;
  57. }
  58.  
  59.  
  60. $sql = sprintf('SELECT * FROM ogloszenia WHERE %s', implode(' AND ', $whereClause));
  61.  
  62. $stmt = $pdo->prepare($sql);
  63. $stmt->execute($parameters);
  64.  
  65. $results = $stmt->fetchAll();
  66. echo "<b>ZNALEZIONO:</b><br>";
  67. foreach($results as $w)
  68. {
  69. echo ''.$w["tytul"].' - '.$w["miasto"].' - '.$w["typ_oferty"].' - '.$w["cena"].'zł<br>';
  70. }
  71.  
  72.  
  73. }
  74. else
  75. {
  76. echo "nie";
  77. }
  78. ?>



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.
Crozin
  1. var_dump($sql, $parameters)
Sprawdź jakie zapytanie jest ostatecznie wykonywane oraz jakie parametry do niego przekazujesz.
Turson
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" }
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.