Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX][HTML][MySQL]Wyszukiwanie po dwóch słowach w dwóch kolumnach, W jaki sposób wyszukiwać po dwóch słowach oddzielonych spacją
nikos
post 11.07.2017, 10:43:28
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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?
Go to the top of the page
+Quote Post
trueblue
post 11.07.2017, 11:07:51
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


  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.


--------------------
Go to the top of the page
+Quote Post
nikos
post 11.07.2017, 11:14:22
Post #3





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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ą
Go to the top of the page
+Quote Post
trueblue
post 11.07.2017, 11:16:56
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


Dlatego też powinieneś rozdzielić szukaną frazę.
Myślisz, że uda się w mniejszym zbiorze znaleźć większy zbiór?


--------------------
Go to the top of the page
+Quote Post
nikos
post 11.07.2017, 11:30:49
Post #5





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


  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

Ten post edytował nikos 11.07.2017, 11:32:57
Go to the top of the page
+Quote Post
trueblue
post 11.07.2017, 11:35:04
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


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.


--------------------
Go to the top of the page
+Quote Post
nikos
post 11.07.2017, 11:41:56
Post #7





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


Właśnie nie zaraz jak nacisnę spacje to wywala ten błąd
Go to the top of the page
+Quote Post
trueblue
post 11.07.2017, 11:43:34
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


https://www.w3schools.com/jsref/jsref_trim_string.asp


--------------------
Go to the top of the page
+Quote Post
nikos
post 11.07.2017, 13:51:27
Post #9





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


Cytat(trueblue @ 11.07.2017, 12:43:34 ) *

Nie bardzo rozumiem?
W jakim celu wykorzystać trim?
Go to the top of the page
+Quote Post
nospor
post 11.07.2017, 15:21:03
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 11.07.2017, 16:55:28
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


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.


--------------------
Go to the top of the page
+Quote Post
nikos
post 12.07.2017, 08:20:52
Post #12





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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
Go to the top of the page
+Quote Post
trueblue
post 12.07.2017, 08:47:51
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


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.


--------------------
Go to the top of the page
+Quote Post
nikos
post 12.07.2017, 09:18:31
Post #14





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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
Go to the top of the page
+Quote Post
trueblue
post 12.07.2017, 09:27:46
Post #15





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


Sprawdź dokładną treść zapytania.


--------------------
Go to the top of the page
+Quote Post
nikos
post 12.07.2017, 09:39:44
Post #16





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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!

Ten post edytował nikos 12.07.2017, 09:40:17
Go to the top of the page
+Quote Post
trueblue
post 12.07.2017, 09:42:55
Post #17





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


A jeśli wpiszesz: "3310 Nokia", to jaki wynik otrzymasz?


--------------------
Go to the top of the page
+Quote Post
nikos
post 12.07.2017, 10:20:55
Post #18





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 30.03.2009

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


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
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: 6.07.2025 - 07:25