![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Z góry proszę o wyrozumiałość bo PHP i SQL zgłębiam aż o 3 dni ![]() Mam następującą bazę:
oraz skrypt php wyświetlający i sortujący dane z tej bazy:
Problem polega na tym, że zapytanie sql sortujące dane pobiera dane ze zmiennych, które z kolei przekazane są z formularza z list wyboru i pola tekstowego niezależnie od tego czy one tam są czy nie (czy w polu tekstowym jest coś wpisane czy nie oraz czy wybrana jest jakaś pozycja z listy. Zapytanie sql jest złożone przy użyciu operatorów AND. Sądziłem, ze w momencie kiedy dla danej kolumny nie będzie wybrana, żadna wartość, a nie ustawie żadnej wartości domyślnej przy <option value=> (a więc zmienna domyślnie pozostaje pusta), zapytanie pobierze wszystkie rekordy, a okazuje się, ze zapytanie szuka pustych pól w danej kolumnie, a przez użycie and, wystarczy jedna pusta zmienna, żeby nie wyświetliło nic. Moge zmienić domyślną wartość pola formularza (a więc zmiennej przekazanej do selct'a) na dowolną wartość właśnie przy options value, ale czy istnieje jakakolwiek wartość, która posłuży za wzorzec odpowiadający dowolnej wartości?? Krótko mówiąc, jaką wartość należy nadać tej zmiennej, żeby select wybrał każdy rekord?? Jeśli nie istnieje taki symbol to jak inaczej rozwiązać sprawę prawidłowego wyszukiwania danych w powyższym skrypcie?? Może jakiś zaawansowany if?? a może zapytanie powinno być inaczej skonstruowane?? Wiem, że mógłbym użyć symboli wieloznacznych jak w przypadku zmiennej fraza, ale wtedy np. kiedy podam wybiorę cyfrę 1 wyświetli rekordy od id 1, 11-19. i wszystkie zawierające gdziekolwiek jedynkę. Bardzo proszę o pomoc. Musze oddać działający projekt na zaliczenie przedmiotu za 1,5tyg, a to tylko jego część i utknąłem na teym sortowaniu danych. Z góry dziękuje. Czekam... |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Zbuduj sobie cos w postaci:
Nie zapomnij o eskejpowaniu danych i sql injection -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dobry pomysł.
Jak rozumiem składnia $zmienna .= cośtam poprostu dodaje do zmiennej kolejną frazę... czyli wtym wypadku cośtam, tak ![]() [jeśli zmienna miała wartość lubie to to po zabiegu j/w będzie miała wartość lubiecostam] ![]() Tak jak zaznaczyłem na początku od 3 (teraz czterech) dni zajmuje się php i mysql i niestety, ale nie jestem pewien czy wiem co to jest eskejpowanie danych. Znalazłem coś takiego , ale nie wiele rozumiem z tego opisu, a w dodatku tłumaczenie jest troszkę kiepskie. To samo tyczy się sql injection ![]() Chciałem też zapytać dlaczego mam używać
skoro w moim skrypcie jest
![]() W takim wypadku chyba powinienem użyć warunku: lub zamiennie:
![]() Chyba, ze coś źle rozumiem?? No i jeszcze jedno pytanko... Czy po takim zabiegu, jaki opisałeś, zapytanie ma wyglądać np. tak:
![]() Będę wdzięczny za dalsze podpowiedzi i dziękuje za pomoc. Ja w akcie desperacji miałem już pisać prawie 30 if'ów, które przewidując wszystkie możliwe kombinacje "pustości" zmiennym lub ich "nie pustości" wywoływałyby konkretne (w pełni opisane) zapytania SQl'a ![]() ![]() Ten post edytował DK.log 28.05.2009, 23:21:37 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Jak rozumiem składnia $zmienna .= cośtam poprostu dodaje do zmiennej kolejną frazę... czyli wtym wypadku cośtam, tak Wszystko jest w manualu, poczytaj. Cytat Chciałem też zapytać dlaczego mam używać Cytat skoro w moim skrypcie jest To było tylko przykładowo. Cytat No i jeszcze jedno pytanko... Czy po takim zabiegu, jaki opisałeś, zapytanie ma wyglądać np. tak: Tak jakby. Ale lepiej dmuchać na zimne i przeczytaj przyklejony temat o SQL Injection. Cytat Ja w akcie desperacji miałem już pisać prawie 30 if'ów, które przewidując wszystkie możliwe kombinacje "pustości" zmiennym lub ich "nie pustości" wywoływałyby konkretne (w pełni opisane) zapytania SQl'a A po co? Pętla + jeden if" title="Zobacz w manualu PHP" target="_manual sprawdzający, czy zmienna jest pusta. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
No dobrze. Poczytałem o eskejpowaniu i o injection...
Tylko, że mi nie chodzi zbytnio o bezpieczeństwo... Nie w tym wypadku. Po pierwsze projekt nigdy nie ujrzy światła dziennego. Po drugie to tylko na zaliczenie przedmiotu. Pisze po raz kolejny ponieważ zbudowałem coś takiego:
I jedyny z tego efekt przy próbie wyświetlania danych to "błąd w pytaniu" ![]() Sprawdziłem, czy prawidłowo przypisało wszystko do zmiennej $where - jest OK. Jak wyświetlić zmienną $where widać ładne zapytanie (a właściwie część zapytania) typu WHERE (id_temat LIKE 'wartość zmiennej') AND (id_przedmiot LIKE 'wartosc zmiennej 2') ... itd Jeśli wyszstkie zmienne są puste wartość zmiennej $where wygląda tak: WHERE (temat LIKE "%%") Wygląda na to, ze sama konstrukcja jest błedna. Co zrobiłem nie tak?? Ten post edytował DK.log 29.05.2009, 19:27:16 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 103 Pomógł: 1 Dołączył: 19.08.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
wiesz co, na prawdę rzuciłem tylko okiem przez przypadek, nie przeczytałem nawet większości Twojego posta, nie mogę teraz, ale obstawiam, że robisz gdzieś błąd związany z rozwijaniem zmiennych. Tam gdzie łączysz stringa ze zmienną php rób tak: $costam = 'tu string, a tu juz'.$zmienna.'a tu znowu string'; Dzięki temu nie będziesz miał problemów. Ogólnie zmienne php ujęte w " " są rozwijane przez parser, a w ' ' traktowane jako string. Możesz łączyć łańcuchy ze zmiennymi dzięki . Może coś pomoże w Twoim problemie.
(.....) Jeśli wyszstkie zmienne są puste wartość zmiennej $where wygląda tak: WHERE (temat LIKE "%%") Wygląda na to, ze sama konstrukcja jest błedna. Co zrobiłem nie tak?? Jeszcze raz rzuciłem okiem i faktycznie tu masz błąd. Popraw na tak:
oczywiście jeżeli dobrze masz skonstruowaną zmienną $where to będzie działać, a przynajmniej taki mi się wydaje. |
|
|
![]() ![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Próbowałem, tak
tez nie działało ![]() Poddałem się i zrobiłem if'ami na piechotę ![]() Masakra była jak to pisałem... cieszyłem się tylko, że musiałem robic tylko tyle ifów ile wynosi kombinacja bez powtórzen z 6'ciu, a nie np. z 12'tu ![]() Ale grunt, że działa ![]() Dzięki wszystkim za pomoc, a poniżej zamieszczam przesłanie dla potomności: UCZCIE SIĘ DOKŁADNIE A NIE PO ŁEBKACH BO BĘDZIECIE MUSIELI ZAMIAST KILKU LINIJEK PISAĆ COŚ TAKIEGO:
![]() ![]() Ten post edytował DK.log 29.05.2009, 21:31:52 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
![]() Zgadza się, podlicz gdzieś, ile zapytań leci do bazy, bo jestem ciekaw. ![]() -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Zapytań jest tyle ile warunków, a więc 26, ale zapytanie do bazy "leci" jedno. Przecież if wykonuje polecenie jeśli warunek jest spełniony...
Sposób na pewno jest "na około" lub jak kto woli "na piechotę", ale serwer sql nie jest nadwyrężony nadmierną ilością zapytań. Co ja poradzę, że sposób
nie działał ![]() Ten post edytował DK.log 3.06.2009, 16:46:37 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 08:11 |