Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ Problem z kwerendą

Napisany przez: marekm65 7.10.2017, 09:25:24

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

Napisany przez: trueblue 7.10.2017, 09:42:34

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.

Napisany przez: marekm65 7.10.2017, 10:14:46

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?

Napisany przez: trueblue 7.10.2017, 10:30:59

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))

Napisany przez: marekm65 7.10.2017, 10:40:18

Kwerenda, którą mi podałeś zwraca pusty wynik, czyli białych spacji brak.

Napisany przez: trueblue 7.10.2017, 10:46:31

A co zwraca zapytanie:

  1. SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'

?

Napisany przez: marekm65 7.10.2017, 10:52:28

Zapytanie zwraca pusty wynik. Gdy to samo zapytanie wpiszę w PHPMyAdmin wszystko jest Ok, walczę z tym już kilka dni i nic.

Napisany przez: trueblue 7.10.2017, 10:54:10

A zapytanie, które podałeś wcześniej, jeśli je wykonujesz bezpośrednio w PHPMyAdmin, to dostajesz wyniki?

Napisany przez: marekm65 7.10.2017, 10:58:01

Jakim tropem więc mam iść?

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

Napisany przez: trueblue 7.10.2017, 11:00:53

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?

Napisany przez: marekm65 7.10.2017, 11:09:24

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


Napisany przez: trueblue 7.10.2017, 11:11:23

A bezpośrednio na bazie obydwa dają wynik, tak?
Jeśli tak, to pokaż w jaki sposób pobierasz wyniki w PHP.

Napisany przez: marekm65 7.10.2017, 11:16:46

  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. http://www.php.net/echo"<br>".$wyszukaj;
  36. $result1 = http://www.php.net/mysql_query($wyszukaj);

Napisany przez: trueblue 7.10.2017, 11:18:49

A gdzie reszta?

Napisany przez: marekm65 7.10.2017, 11:26:00

  1. <?
  2. http://www.php.net/session_start();
  3. ?>
  4. <html>
  5. <head>
  6. <link rel="stylesheet" href="css/style.css">
  7. <meta charset="UTF-8">
  8. </head>
  9. <body>
  10. <?
  11. http://www.php.net/ini_set('display_errors', 'on');
  12. http://www.php.net/ini_set('error_reporting', 'E_ALL | E_STRICT');
  13. if (http://www.php.net/isset($_SESSION['logged'])) http://www.php.net/echo"<p>Użytkownik zalogowany - ".$_SESSION['logged']. " <a href='index.php?a=logout'>Wyloguj</a></p>";
  14. include('header.php');
  15. include('menu.php');
  16. http://www.php.net/echo"<h2 align='center'>Wynik wyszukiwania</h2>";
  17. include('link.php');
  18.  
  19. $maszyna=$_POST['maszyna']; if($maszyna==NULL) $maszyna="%"; //echo"<br>Maszyna = ".$maszyna;
  20. $nazwa_asortymentu=$_POST['nazwa_asortymentu'];
  21. if($nazwa_asortymentu==NULL) $nazwa_asortymentu="%";
  22.  
  23. $przedza=$_POST['przedza'];
  24. if($przedza==NULL) $przedza="%";
  25. //echo"<br>Przędza = ".$przedza;
  26.  
  27. $l1r=$_POST['l1r'];
  28. if($l1r==NULL) $l1r="%";
  29.  
  30. $l1p=$_POST['l1p'];
  31. if($l1p==NULL) $l1p="%";
  32.  
  33. $l2r=$_POST['l2r'];
  34. if($l2r==NULL) $l2r="%";
  35.  
  36. $l2p=$_POST['l2p'];
  37. if($l2p==NULL) $l2p="%";
  38.  
  39. $oczka=$_POST['oczka'];
  40. if($oczka==NULL) $oczka="%";
  41.  
  42. $dzien=$_POST['dzien'];
  43. if($dzien==NULL) $dzien="%";
  44.  
  45. $miesiac=$_POST['miesiac'];
  46. if($miesiac==NULL) $dzien="%";
  47.  
  48. $rok=$_POST['rok'];
  49. if($rok==NULL) $rok="%";
  50.  
  51. $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')";
  52. //$wyszukaj="SELECT * FROM produkcja WHERE (nazwa_asortymentu LIKE '%$nazwa_asortymentu%')";
  53.  
  54. //$wyszukaj="SELECT * FROM produkcja WHERE CHAR_LENGTH(nazwa_asortymentu)<>CHAR_LENGTH(TRIM(nazwa_asortymentu))";
  55. //$wyszukaj = "SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'";
  56.  
  57. http://www.php.net/echo"<br>".$wyszukaj;
  58. $result1 = http://www.php.net/mysql_query($wyszukaj);
  59.  
  60. if ($rek1 = http://www.php.net/mysql_fetch_array($result1)) {
  61. http://www.php.net/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>";
  62. $i=0;
  63. while($rek = http://www.php.net/mysql_fetch_array($result1)) {
  64. if ($i%2==0) http://www.php.net/echo"<tr bgcolor='#ADD8E6' align='center'>"; else http://www.php.net/echo"<tr bgcolor='#87CEFA' align='center'>";
  65. http://www.php.net/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>";
  66. $i++; }
  67. http://www.php.net/echo"</table>";
  68. // Koniec kodu
  69. }
  70. if ($i!=0) {
  71. http://www.php.net/echo "<p align='center'>Liczba znalezionych rekrodów - ".$i."</p>";} else http://www.php.net/echo"<p align='center'>Brak wyników wyszukiwania</p>";
  72. ?>
  73. <h3 align='center'><a href='wyszukaj.php'>Nowe wyszukiwanie</a></h3>
  74. </body>
  75. </html>

Napisany przez: trueblue 7.10.2017, 11:35:03

Pobierasz dwa razy rekordy, raz w if drugi raz w while.

Napisany przez: marekm65 7.10.2017, 14:45:31

Serdeczne dzięki za pomoc. Problem rozwiązany, miłego weekendu. Pozdrawiam. Marek

Napisany przez: viking 7.10.2017, 14: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.

Napisany przez: marekm65 10.10.2017, 21:38:05

Robię to na serwerze strony firmowej kolegi. Programik jest do obsługi dziewiarni. A pliki znajdują się na serwerze Ogicom.

Napisany przez: viking 11.10.2017, 05:47:11

To pozostaje mieć tylko nadzieję że nie trzyma tam nic ważnego typu dane klientów.

Napisany przez: marekm65 11.10.2017, 06:51:46

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?

Napisany przez: viking 11.10.2017, 07:01:44

https://pl.wikipedia.org/wiki/SQL_injection
http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet

Napisany przez: marekm65 11.10.2017, 21:28:25

Dziękuję bardzo, pozdrawiam. Marek

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)