Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z kwerendą
Forum PHP.pl > Forum > Bazy danych > MySQL
marekm65
Witam serdecznie!

Mam na swojej stronie wyszukiwarkę, która nie do końca działa poprawnie

Kwerenda wyszukująca ma postać:
  1. SELECT * FROM produkcja WHERE (maszyna LIKE '%' AND nazwa_asortymentu LIKE '724' AND przedza LIKE '%' AND l1r LIKE '%' AND l1p LIKE '%' AND l2r LIKE '%' AND l2p LIKE '%' AND oczka LIKE '%' AND dzien LIKE '%' AND miesiac LIKE '%' AND rok LIKE '%')


Jeśli nie wpiszę w formularz nazwy asortymentu wszystko działa Ok, jeśli wpiszę asortyment 724 znajdujący się w bazie w tabeli `produkcja` w rezultacie nie dostaję żadnego wyniku. Gdy wpiszę jako nazwę ciąg liter np tiul wszystko działa poprawnie. Pole nazwa asortymentu jest typu tekstowego. Inne zapytania bez nazwy asortymentu wykonują się poprawnie.

Co robię źle? Proszę o podpowiedź,

Pozdrawiam,

Marek
trueblue
Jeśli nazwa asortymentu zawiera frazę 724, a nie stanowi tylko 724, to fragment:
  1. nazwa_asortymentu LIKE '724'

powinien wyglądać tak:
  1. nazwa_asortymentu LIKE '%724%'


Postaraj się na poziomie skryptu zoptymalizować budowę zapytania - wszystkie LIKE '%' są zupełnie niepotrzebne.
marekm65
Dziekuję za szybką odpowiedź. Nazwa asortymentu 724 to cała jego nazwa. Tak samo tiul, z tym że tiul wyszukuje, a 724 nie. Co może być nie tak?
trueblue
A nie ma tam czasem spacji lub innego białego znaku?

Sprawdź:
  1. SELECT * FROM produkcja WHERE CHAR_LENGTH(nazwa_asortymentu)<>CHAR_LENGTH(TRIM(nazwa_asortymentu))
marekm65
Kwerenda, którą mi podałeś zwraca pusty wynik, czyli białych spacji brak.
trueblue
A co zwraca zapytanie:
  1. SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'

?
marekm65
Zapytanie zwraca pusty wynik. Gdy to samo zapytanie wpiszę w PHPMyAdmin wszystko jest Ok, walczę z tym już kilka dni i nic.
trueblue
A zapytanie, które podałeś wcześniej, jeśli je wykonujesz bezpośrednio w PHPMyAdmin, to dostajesz wyniki?
marekm65
Jakim tropem więc mam iść?

"SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE 'tiul'"; - kwerenda w takiej postaci z poziomu PHP działa.
trueblue
Zapytanie:
  1. SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE 'tiul'

z poziomu PHP działa, a zapytanie:
  1. SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'

nie działa?
marekm65
Niestety nie. Gdy tylko zmienię tiul na 724 w kwerendzie wynik jest pusty mimo, że taki rekord istnieje.

Pole nazwa_asortymentu w bazie jest typu text
Metoda porównywania napisów utf8_polish_ci

trueblue
A bezpośrednio na bazie obydwa dają wynik, tak?
Jeśli tak, to pokaż w jaki sposób pobierasz wyniki w PHP.
marekm65
  1. include('link.php');
  2.  
  3. $maszyna=$_POST['maszyna']; if($maszyna==NULL) $maszyna="%"; //echo"<br>Maszyna = ".$maszyna;
  4. $nazwa_asortymentu=$_POST['nazwa_asortymentu'];
  5. $przedza=$_POST['przedza'];
  6. if($przedza==NULL) $przedza="%";
  7. //echo"<br>Przędza = ".$przedza;
  8.  
  9. $l1r=$_POST['l1r'];
  10. if($l1r==NULL) $l1r="%";
  11.  
  12. $l1p=$_POST['l1p'];
  13. if($l1p==NULL) $l1p="%";
  14.  
  15. $l2r=$_POST['l2r'];
  16. if($l2r==NULL) $l2r="%";
  17.  
  18. $l2p=$_POST['l2p'];
  19. if($l2p==NULL) $l2p="%";
  20.  
  21. $oczka=$_POST['oczka'];
  22. if($oczka==NULL) $oczka="%";
  23.  
  24. $dzien=$_POST['dzien'];
  25. if($dzien==NULL) $dzien="%";
  26.  
  27. $miesiac=$_POST['miesiac'];
  28. if($miesiac==NULL) $dzien="%";
  29.  
  30. $rok=$_POST['rok'];
  31. if($rok==NULL) $rok="%";
  32.  
  33. $wyszukaj = "SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'";
  34.  
  35. echo"<br>".$wyszukaj;
  36. $result1 = mysql_query($wyszukaj);
trueblue
A gdzie reszta?
marekm65
  1. <?
  2. ?>
  3. <html>
  4. <head>
  5. <link rel="stylesheet" href="css/style.css">
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <?
  10. ini_set('display_errors', 'on');
  11. ini_set('error_reporting', 'E_ALL | E_STRICT');
  12. if (isset($_SESSION['logged'])) echo"<p>Użytkownik zalogowany - ".$_SESSION['logged']. " <a href='index.php?a=logout'>Wyloguj</a></p>";
  13. include('header.php');
  14. include('menu.php');
  15. echo"<h2 align='center'>Wynik wyszukiwania</h2>";
  16. include('link.php');
  17.  
  18. $maszyna=$_POST['maszyna']; if($maszyna==NULL) $maszyna="%"; //echo"<br>Maszyna = ".$maszyna;
  19. $nazwa_asortymentu=$_POST['nazwa_asortymentu'];
  20. if($nazwa_asortymentu==NULL) $nazwa_asortymentu="%";
  21.  
  22. $przedza=$_POST['przedza'];
  23. if($przedza==NULL) $przedza="%";
  24. //echo"<br>Przędza = ".$przedza;
  25.  
  26. $l1r=$_POST['l1r'];
  27. if($l1r==NULL) $l1r="%";
  28.  
  29. $l1p=$_POST['l1p'];
  30. if($l1p==NULL) $l1p="%";
  31.  
  32. $l2r=$_POST['l2r'];
  33. if($l2r==NULL) $l2r="%";
  34.  
  35. $l2p=$_POST['l2p'];
  36. if($l2p==NULL) $l2p="%";
  37.  
  38. $oczka=$_POST['oczka'];
  39. if($oczka==NULL) $oczka="%";
  40.  
  41. $dzien=$_POST['dzien'];
  42. if($dzien==NULL) $dzien="%";
  43.  
  44. $miesiac=$_POST['miesiac'];
  45. if($miesiac==NULL) $dzien="%";
  46.  
  47. $rok=$_POST['rok'];
  48. if($rok==NULL) $rok="%";
  49.  
  50. $wyszukaj="SELECT * FROM produkcja WHERE (maszyna LIKE '$maszyna' AND nazwa_asortymentu LIKE '$nazwa_asortymentu' AND przedza LIKE '$przedza' AND l1r LIKE '$l1r' AND l1p LIKE '$l1p' AND l2r LIKE '$l2r' AND l2p LIKE '$l2p' AND oczka LIKE '$oczka' AND dzien LIKE '$dzien' AND miesiac LIKE '$miesiac' AND rok LIKE '$rok')";
  51. //$wyszukaj="SELECT * FROM produkcja WHERE (nazwa_asortymentu LIKE '%$nazwa_asortymentu%')";
  52.  
  53. //$wyszukaj="SELECT * FROM produkcja WHERE CHAR_LENGTH(nazwa_asortymentu)<>CHAR_LENGTH(TRIM(nazwa_asortymentu))";
  54. //$wyszukaj = "SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'";
  55.  
  56. echo"<br>".$wyszukaj;
  57. $result1 = mysql_query($wyszukaj);
  58.  
  59. if ($rek1 = mysql_fetch_array($result1)) {
  60. echo"<table align='center' border='0' cellspacing='6' cellpadding='6'><tr bgcolor='#55acee'><th>ID</th><th>Data dodania</th><th>Masz.</th><th>Asort.</th><th>Przędza</th><th>Spec. barw.</th><th>L1-R dół</th><th>L1-P</th><th>L1-W</th><th>L2-R</th><th>L2-P</th><th>L2-W</th><th>L3-R</th><th>L3-P</th><th>L3-W</th><th>Oczka</th><th>mb</th><th align='center'>kg</th><th>Gram.</th><th>Szer.</th><th>Dane</th><th>Kod błędu</th><th>Serwis</th></tr>";
  61. $i=0;
  62. while($rek = mysql_fetch_array($result1)) {
  63. if ($i%2==0) echo"<tr bgcolor='#ADD8E6' align='center'>"; else echo"<tr bgcolor='#87CEFA' align='center'>";
  64. echo"<td>".$rek['lp']."</td><td>".$rek['data']."</td><td align='center'>".$rek['maszyna']."</td><td>".$rek['nazwa_asortymentu']."</td><td>".$rek['przedza']."</td><td>".$rek['specyfikacja']."</td><td>".$rek['l1r']."</td><td>".$rek['l1p']."</td><td>".$rek['l1w']."</td><td>".$rek['l2r']."</td><td>".$rek['l2p']."</td><td>".$rek['l2w']."</td><td>".$rek['l3r']."</td><td>".$rek['l3p']."</td><td>".$rek['l3w']."</td><td>".$rek['oczka']."</td><td>".$rek['mb']." mb</td><td>".$rek['kg']." kg</td><td align='right'>".$rek['gramatura']." g/m<sup>2</sup></td><td>".$rek['szerokość']." cm</td><td>".$rek['dane']."</td><td>".$rek['kod_bledu']."</td><td width='150'>".$rek['serwis']."</td></tr>";
  65. $i++; }
  66. echo"</table>";
  67. // Koniec kodu
  68. }
  69. if ($i!=0) {
  70. echo "<p align='center'>Liczba znalezionych rekrodów - ".$i."</p>";} else echo"<p align='center'>Brak wyników wyszukiwania</p>";
  71. ?>
  72. <h3 align='center'><a href='wyszukaj.php'>Nowe wyszukiwanie</a></h3>
  73. </body>
  74. </html>
trueblue
Pobierasz dwa razy rekordy, raz w if drugi raz w while.
marekm65
Serdeczne dzięki za pomoc. Problem rozwiązany, miłego weekendu. Pozdrawiam. Marek
viking
Ty to gdzieś produkcyjne używasz? Jest pełno dziur, stare rozszerzenie mysql, kolorowanie wierszy w CSS się robi, używaj pełnego '<?php' itd.
marekm65
Robię to na serwerze strony firmowej kolegi. Programik jest do obsługi dziewiarni. A pliki znajdują się na serwerze Ogicom.
viking
To pozostaje mieć tylko nadzieję że nie trzyma tam nic ważnego typu dane klientów.
marekm65
Cytat(viking @ 7.10.2017, 15:58:39 ) *
Ty to gdzieś produkcyjne używasz? Jest pełno dziur, stare rozszerzenie mysql, kolorowanie wierszy w CSS się robi, używaj pełnego '<?php' itd.


Co masz konkretnie na myśli pisząc, że jest pełno dziur?
marekm65
Dziękuję bardzo, pozdrawiam. Marek
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.