Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][HTML][MySQL]Wyszukiwanie po dwóch słowach w dwóch kolumnach
Forum PHP.pl > Forum > Przedszkole
nikos
Mam prosty skrypt wyszukiwania danych z bazy. Problemy zaczynając się gdy chce wyszukać dwa wyrazy np Nokia 3220
  1. <?php
  2. //fetch.php
  3. $servername = "localhost";
  4. $username = "root";
  5. $password = "";
  6. $dbname = "mydb";
  7. $connect = mysqli_connect($servername, $username, $password, $dbname);
  8. $output = '';
  9. if(isset($_POST["query"]))
  10. {
  11. $search = mysqli_real_escape_string($connect, $_POST["query"]);
  12.  
  13.  
  14. $query = "
  15. SELECT * FROM telefony
  16. WHERE (model LIKE '%$search%' OR marka LIKE '%$search%')AND( model LIKE '$search%' OR marka LIKE '%$search%') LIMIT 10
  17. ";
  18.  
  19. }
  20. else
  21. {
  22. $query = "
  23. SELECT * FROM telefony ORDER BY ID LIMIT 0
  24. ";
  25. }
  26. $result = mysqli_query($connect, $query);
  27. if(mysqli_num_rows($result) > 0)
  28. {
  29. $output .= '
  30. <div class="table-responsive">
  31. <table class="table table bordered">
  32. <tr>
  33. <th>Model</th>
  34. <th>Marka</th>
  35. <th>Cena</th>
  36.  
  37. </tr>
  38. ';
  39. while($row = mysqli_fetch_array($result))
  40. {
  41. $output .= '
  42. <tr>
  43. <td>'.$row["marka"].'</td>
  44. <td>'.$row["model"].'</td>
  45. <td>'.$row["cena"].'</td>
  46. </tr>
  47. ';
  48. }
  49. echo $output;
  50. }
  51. else
  52. {
  53. echo 'Przepraszamy nie znaleziono rekordów';
  54. }
  55.  
  56. ?>


Oraz plik html
  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3. <title>Telefony</title>
  4. <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  5. </head>
  6. <body>
  7. <div class="container">
  8. <br />
  9. <h2 align="center">Ajax Live Data Search using Jquery PHP MySql</h2><br />
  10. <div class="form-group">
  11. <div class="input-group">
  12. <span class="input-group-addon">Search</span>
  13. <input type="text" name="search_text" id="search_text" placeholder="Search by Customer Details" class="form-control" />
  14. </div>
  15. </div>
  16. <br />
  17. <div id="result"></div>
  18. </div>
  19. </body>
  20. </html>
  21.  
  22.  
  23. $(document).ready(function(){
  24.  
  25. load_data();
  26.  
  27. function load_data(query)
  28. {
  29. $.ajax({
  30. url:"fetch.php",
  31. method:"POST",
  32. data:{query:query},
  33. success:function(data)
  34. {
  35. $('#result').html(data);
  36. }
  37. });
  38. }
  39. $('#search_text').keyup(function(){
  40. var search = $(this).val();
  41. if(search != '')
  42. {
  43. load_data(search);
  44. }
  45. else
  46. {
  47. load_data();
  48. }
  49. });
  50. });


W jaki sposób zmodyfikować zapytanie do bazy aby wyszukiwało też po dwóch słowach?
Czy trzeba $query rozdzielić po spacji?
trueblue
  1. SELECT * FROM telefony WHERE (model LIKE '%Nokia%' OR marka LIKE '%3320%') OR (model LIKE '%3320%' OR marka LIKE '%Nokia%') LIMIT 10

lub
  1. SELECT * FROM telefony WHERE (model LIKE '%Nokia%' AND marka LIKE '%3320%') OR (model LIKE '%3320%' AND marka LIKE '%Nokia%') LIMIT 10


Jeśli modele i marki nie zawierają inny łańcuchów znaków, tylko są to stricte modele i marki, to możesz zamiast LIKE użyć porównania.
nikos
Tak twój przykład działa jeśli oddzielnie przekażesz model i marke telefonu.
U mnie dane pobierane są z input do zmiennej $search po której dalej wyszukuję. Znajduje jak wpiszę sam model lub samą markę ale gdy wcisnę spacje wyniki znikają
trueblue
Dlatego też powinieneś rozdzielić szukaną frazę.
Myślisz, że uda się w mniejszym zbiorze znaleźć większy zbiór?
nikos
  1. <?php
  2. //fetch.php
  3. $servername = "localhost";
  4. $username = "root";
  5. $password = "";
  6. $dbname = "mydatabse";
  7. $connect = mysqli_connect($servername, $username, $password, $dbname);
  8. $output = '';
  9. if(isset($_POST["query"]))
  10. {
  11.  
  12. $search = mysqli_real_escape_string($connect, $_POST["query"]);
  13. if (strpos($search, ' ') > 0) {
  14. $calosc = explode($search, ' ');
  15. $model = $calosc[0];
  16. $marka = $calosc[1];
  17. $query = "
  18. SELECT * FROM telefony
  19. WHERE (model LIKE '%$model%' AND marka LIKE '%$marka%') OR (model LIKE '%$marka%' AND marka LIKE '%$model%') LIMIT 10
  20. ";
  21. }
  22.  
  23. $query = "
  24. SELECT * FROM telefony
  25. WHERE (model LIKE '%$search%' OR marka LIKE '%$search%') LIMIT 10
  26. ";
  27.  
  28. }
  29. else
  30. {
  31. $query = "
  32. SELECT * FROM telefony ORDER BY ID LIMIT 0
  33. ";
  34. }
  35. $result = mysqli_query($connect, $query);
  36. if(mysqli_num_rows($result) > 0)
  37. {
  38. $output .= '
  39. <div class="table-responsive">
  40. <table class="table table bordered">
  41. <tr>
  42. <th>Model</th>
  43. <th>Marka</th>
  44. <th>Cena</th>
  45.  
  46. </tr>
  47. ';
  48. while($row = mysqli_fetch_array($result))
  49. {
  50. $output .= '
  51. <tr>
  52. <td>'.$row["marka"].'</td>
  53. <td>'.$row["model"].'</td>
  54. <td>'.$row["cena"].'</td>
  55. </tr>
  56. ';
  57. }
  58. echo $output;
  59. }
  60. else
  61. {
  62. echo 'Przepraszamy nie znaleziono rekordów';
  63. }
  64.  
  65. ?>


Dodałem kod ale wywala błąd. Undefined offset: line 16
trueblue
A czasem nie wywala tego błędu przy jednym wyrazie?
Przemyśl jeszcze działanie jeśli ktoś wpisze frazę z więcej niż dwóch wyrazów.
nikos
Właśnie nie zaraz jak nacisnę spacje to wywala ten błąd
nikos
Cytat(trueblue @ 11.07.2017, 12:43:34 ) *

Nie bardzo rozumiem?
W jakim celu wykorzystać trim?
nospor
trim wyczysci ci tylko zbedne spacje na poczatku i na koncu.

Blad zas co pokazales wynika z tego
$calosc = explode($search, ' ');
$model = $calosc[0];
$marka = $calosc[1];

Zawsze zakladasz ze istnieje $calosc[1] co jest rzecz jasna blednym zalozeniem bo nie zawsze ktos w wyszukiwarce wpisze dwa slowa. Musisz sprawdzc czy $calosc[1] istnieje i w zaleznosci od tego szukac albo dwoch slow albo jednego. Od biedy jak nie istnieje to za $marka podstawiac nic ale to i tak wowczas zapytanie bedzie do kitu
trueblue
trim pomoże Ci przy linijce: if(search != '')
Jeśli przed tym dasz trim na wartości, to nie będziesz słał wartości dopóki nie pojawi się inny znak niż biały znak. Czyli rozwiąże problem, o którym pisałeś wyżej.
nikos
Cytat(nospor @ 11.07.2017, 16:21:03 ) *
trim wyczysci ci tylko zbedne spacje na poczatku i na koncu.

Blad zas co pokazales wynika z tego
$calosc = explode($search, ' ');
$model = $calosc[0];
$marka = $calosc[1];

Zawsze zakladasz ze istnieje $calosc[1] co jest rzecz jasna blednym zalozeniem bo nie zawsze ktos w wyszukiwarce wpisze dwa slowa. Musisz sprawdzc czy $calosc[1] istnieje i w zaleznosci od tego szukac albo dwoch slow albo jednego. Od biedy jak nie istnieje to za $marka podstawiac nic ale to i tak wowczas zapytanie bedzie do kitu

Właśnie myślałem, że mogę sprawdzić ilość słów w $search np tak w kodzie PHP
  1. $search = mysqli_real_escape_string($connect, $_POST["query"]);
  2.  
  3. if (str_word_count($search) > 1) {
  4. $calosc = explode($search, ' ');
  5. $model = $calosc[0];
  6. $marka = $calosc[1];
  7. $query = "
  8. SELECT * FROM telefony
  9. WHERE (model LIKE '%$model%' AND marka LIKE '%$marka%') OR (model LIKE '%$marka%' AND marka LIKE '%$model%') LIMIT 10
  10. ";
  11. }
  12. else{
  13. $query = "
  14. SELECT * FROM telefony
  15. WHERE (model LIKE '%$search%' OR marka LIKE '%$search%') LIMIT 10
  16. ";
  17. }

Ale to nie załatwiało błędu więc
  1. $search = mysqli_real_escape_string($connect, $_POST["query"]);
  2.  
  3. $calosc = explode($search, ' ');
  4. $model = $calosc[0];
  5. if(isset($calosc[1])){
  6. $marka = $calosc[1];
  7. $query = "
  8. SELECT * FROM telefony
  9. WHERE (model LIKE '%$model%' AND marka LIKE '%$marka%') OR (model LIKE '%$marka%' AND marka LIKE '%$model%') LIMIT 10
  10. ";
  11. }
  12. else{ $query = "
  13. SELECT * FROM telefony
  14. WHERE (model LIKE '%$search%' OR marka LIKE '%$search%') LIMIT 10
  15. ";}


Zmieniłem kod na taki. Błąd zniknął ale w momencie jak wcisnę spacje i wpisuję drugie słowo nie mam wyników...
Przypuszczam, że liczenie słów po stronie php działa ale nie w momencie gdy przesyłamy dane za pomocą ajax live
Pozdrawiam

Cytat(trueblue @ 11.07.2017, 17:55:28 ) *
trim pomoże Ci przy linijce: if(search != '')
Jeśli przed tym dasz trim na wartości, to nie będziesz słał wartości dopóki nie pojawi się inny znak niż biały znak. Czyli rozwiąże problem, o którym pisałeś wyżej.

Dziękuje za odpowiedź
Po zmianach w php dodałem też funkcję trim
  1. $('#search_text').keyup(function(){
  2. var search = $(this).val();
  3. search = search.trim();
  4. if(search != '')
  5.  

Która powoduje że wyniki nie znikają po spacji (tak jak napisałeś) ale dopiero jak zacznę wpisywać pierwszą literę modelu
trueblue
Przemyśl działanie skryptu pod kątem wielu wyrazów, proponowałem Ci to wcześniej.
Co z tego, że w tym momencie obsłużysz dwa wyrazy, skoro ktoś może wpisać: Super Nokia 3310. Obecnie złapiesz tylko: Super Nokia.
nikos
Cytat(trueblue @ 12.07.2017, 09:47:51 ) *
Przemyśl działanie skryptu pod kątem wielu wyrazów, proponowałem Ci to wcześniej.
Co z tego, że w tym momencie obsłużysz dwa wyrazy, skoro ktoś może wpisać: Super Nokia 3310. Obecnie złapiesz tylko: Super Nokia.

Tak jest to ważne zgadzam się ale nie przychodzi mi nic do głowy na razie i tak nie wyszukuje mi po dwóch słowach j.w. wyniki znikają jak zaczynam wpisywać pierwszą literę drugiego słowa:
Nokia - są wyniki
Spacja - są wyniki
3 - brak wyników
Pozdrawiam
trueblue
Sprawdź dokładną treść zapytania.
nikos
Cytat(trueblue @ 12.07.2017, 10:27:46 ) *
Sprawdź dokładną treść zapytania.

Pomogła zmiana pliku php który zmieniłem następująco:
  1. <?php
  2. //fetch.php
  3. $servername = "localhost";
  4. $username = "root";
  5. $password = "";
  6. $dbname = "mysdb";
  7. $connect = mysqli_connect($servername, $username, $password, $dbname);
  8. $output = '';
  9. if(isset($_POST["query"]))
  10. {$search = mysqli_real_escape_string($connect, $_POST["query"]);
  11. $query = "select * from telefony where concat_ws(' ',marka,model)
  12. like '%$search%' LIMIT 10
  13. ";
  14.  
  15. }
  16. else
  17. {
  18. $query = "
  19. SELECT * FROM telefony ORDER BY ID LIMIT 0
  20. ";
  21. }
  22. $result = mysqli_query($connect, $query);
  23. if(mysqli_num_rows($result) > 0)
  24. {
  25. $output .= '
  26. <div class="table-responsive">
  27. <table id="example" class="table bordered">
  28. <tr>
  29. <th>Marka</th>
  30. <th>Model</th>
  31. <th>Cena</th>
  32. <th></th>
  33.  
  34. </tr>
  35. ';
  36. while($row = mysqli_fetch_array($result))
  37. {
  38. $output .= '
  39. <tr>
  40. <td>'.$row["marka"].'</td>
  41. <td>'.$row["model"].'</td>
  42. <td>'.$row["cena"].'</td>
  43. <td><button class="btn-xs btn-primary wrzuc">Wybierz</button></td>
  44. </tr>
  45. ';
  46. }
  47. echo $output;
  48. }
  49. else
  50. {
  51. echo 'Przepraszamy nie znaleziono rekordów. W celu ustalenia ceny prosimy o kontakt';
  52. }
  53.  
  54. ?>


Zmiana składni zapytania w bazie pomogła teraz wyszukuję po dwóch słowach z dwóch kolumn.
Dzięki za pomoc i podpowiedzi!
trueblue
A jeśli wpiszesz: "3310 Nokia", to jaki wynik otrzymasz?
nikos
Cytat(trueblue @ 12.07.2017, 10:42:55 ) *
A jeśli wpiszesz: "3310 Nokia", to jaki wynik otrzymasz?

Tutaj brakuje wyników moje query sprawdza tylko po marka, model.
  1. $query = "select * from telefony where (concat_ws(' ',marka,model)
  2. like '%$search%') OR (concat_ws(' ',model,marka)
  3. like '%$search%') LIMIT 10
  4. ";

To załatwia sprawę.
Jednak jeśli model składa się z większej ilości słów np 201 Lumia to w momencie jak wpiszę Nokia 201 wyszukuje ale już Nokia Lumia nie jeśli wpisze Nokia 201 Lumia to wyświetla.

Testuje dalej
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.