Witam serdecznie!
Mam na swojej stronie wyszukiwarkę, która nie do końca działa poprawnie
Kwerenda wyszukująca ma postać:
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
Jeśli nazwa asortymentu zawiera frazę 724, a nie stanowi tylko 724, to fragment:
nazwa_asortymentu LIKE '724'
nazwa_asortymentu LIKE '%724%'
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?
A nie ma tam czasem spacji lub innego białego znaku?
Sprawdź:
SELECT * FROM produkcja WHERE CHAR_LENGTH(nazwa_asortymentu)<>CHAR_LENGTH(TRIM(nazwa_asortymentu))
Kwerenda, którą mi podałeś zwraca pusty wynik, czyli białych spacji brak.
A co zwraca zapytanie:
SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'
Zapytanie zwraca pusty wynik. Gdy to samo zapytanie wpiszę w PHPMyAdmin wszystko jest Ok, walczę z tym już kilka dni i nic.
A zapytanie, które podałeś wcześniej, jeśli je wykonujesz bezpośrednio w PHPMyAdmin, to dostajesz wyniki?
Jakim tropem więc mam iść?
"SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE 'tiul'"; - kwerenda w takiej postaci z poziomu PHP działa.
Zapytanie:
SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE 'tiul'
SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'
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
A bezpośrednio na bazie obydwa dają wynik, tak?
Jeśli tak, to pokaż w jaki sposób pobierasz wyniki w PHP.
include('link.php'); $maszyna=$_POST['maszyna']; if($maszyna==NULL) $maszyna="%"; //echo"<br>Maszyna = ".$maszyna; $nazwa_asortymentu=$_POST['nazwa_asortymentu']; $przedza=$_POST['przedza']; if($przedza==NULL) $przedza="%"; //echo"<br>Przędza = ".$przedza; $l1r=$_POST['l1r']; if($l1r==NULL) $l1r="%"; $l1p=$_POST['l1p']; if($l1p==NULL) $l1p="%"; $l2r=$_POST['l2r']; if($l2r==NULL) $l2r="%"; $l2p=$_POST['l2p']; if($l2p==NULL) $l2p="%"; $oczka=$_POST['oczka']; if($oczka==NULL) $oczka="%"; $dzien=$_POST['dzien']; if($dzien==NULL) $dzien="%"; $miesiac=$_POST['miesiac']; if($miesiac==NULL) $dzien="%"; $rok=$_POST['rok']; if($rok==NULL) $rok="%"; $wyszukaj = "SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'"; http://www.php.net/echo"<br>".$wyszukaj; $result1 = http://www.php.net/mysql_query($wyszukaj);
A gdzie reszta?
<? http://www.php.net/session_start(); ?> <html> <head> <link rel="stylesheet" href="css/style.css"> <meta charset="UTF-8"> </head> <body> <? http://www.php.net/ini_set('display_errors', 'on'); http://www.php.net/ini_set('error_reporting', 'E_ALL | E_STRICT'); 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>"; include('header.php'); include('menu.php'); http://www.php.net/echo"<h2 align='center'>Wynik wyszukiwania</h2>"; include('link.php'); $maszyna=$_POST['maszyna']; if($maszyna==NULL) $maszyna="%"; //echo"<br>Maszyna = ".$maszyna; $nazwa_asortymentu=$_POST['nazwa_asortymentu']; if($nazwa_asortymentu==NULL) $nazwa_asortymentu="%"; $przedza=$_POST['przedza']; if($przedza==NULL) $przedza="%"; //echo"<br>Przędza = ".$przedza; $l1r=$_POST['l1r']; if($l1r==NULL) $l1r="%"; $l1p=$_POST['l1p']; if($l1p==NULL) $l1p="%"; $l2r=$_POST['l2r']; if($l2r==NULL) $l2r="%"; $l2p=$_POST['l2p']; if($l2p==NULL) $l2p="%"; $oczka=$_POST['oczka']; if($oczka==NULL) $oczka="%"; $dzien=$_POST['dzien']; if($dzien==NULL) $dzien="%"; $miesiac=$_POST['miesiac']; if($miesiac==NULL) $dzien="%"; $rok=$_POST['rok']; if($rok==NULL) $rok="%"; $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')"; //$wyszukaj="SELECT * FROM produkcja WHERE (nazwa_asortymentu LIKE '%$nazwa_asortymentu%')"; //$wyszukaj="SELECT * FROM produkcja WHERE CHAR_LENGTH(nazwa_asortymentu)<>CHAR_LENGTH(TRIM(nazwa_asortymentu))"; //$wyszukaj = "SELECT * FROM produkcja WHERE nazwa_asortymentu LIKE '724'"; http://www.php.net/echo"<br>".$wyszukaj; $result1 = http://www.php.net/mysql_query($wyszukaj); if ($rek1 = http://www.php.net/mysql_fetch_array($result1)) { 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>"; $i=0; while($rek = http://www.php.net/mysql_fetch_array($result1)) { 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'>"; 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>"; $i++; } http://www.php.net/echo"</table>"; // Koniec kodu } if ($i!=0) { 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>"; ?> <h3 align='center'><a href='wyszukaj.php'>Nowe wyszukiwanie</a></h3> </body> </html>
Pobierasz dwa razy rekordy, raz w if drugi raz w while.
Serdeczne dzięki za pomoc. Problem rozwiązany, miłego weekendu. Pozdrawiam. Marek
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.
Robię to na serwerze strony firmowej kolegi. Programik jest do obsługi dziewiarni. A pliki znajdują się na serwerze Ogicom.
To pozostaje mieć tylko nadzieję że nie trzyma tam nic ważnego typu dane klientów.
https://pl.wikipedia.org/wiki/SQL_injection
http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
Dziękuję bardzo, pozdrawiam. Marek
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)