Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ograniczenie daty
rafalekjan
post 9.12.2010, 00:43:01
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2010

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


Witam.

Próbuję odfiltrować niepotrzebne dane z bazy danych.
Filtracja odbywa się przez wybranie daty, numer użytkownika jest pobierany automatycznie po zalogowaniu.

Kod wygląda tak:
  1. if (($searchtext !='') and ($searchtext2 !='')){
  2. $where .="where main.time between '.%$searchtext%.' and '.%$searchtext2%.' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  3.  
  4. }
  5. else{
  6. if ($searchtext !=''){
  7. $where .="where time >= '.%$searchtext%.' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  8.  
  9. }
  10. else{
  11. if ($searchtext2 !=''){
  12. $where .="where time <= '.%$searchtext2%.' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  13.  
  14. }
  15. else{
  16.  
  17. $where .='where time > 0 and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type';
  18. }
  19. }} }
  20.  
  21.  
  22. $pomiarki=@mysql_query('SELECT main.time, main.msrt, liczniki.loc1, liczniki.loc2, liczniki.loc3 FROM main, liczniki '.$where.' GROUP BY main.time, main.msrt, liczniki.loc1, liczniki.loc2, liczniki.loc3');


Kiedy nie wpiszemy żadnego ograniczenia wyrzuca dane jakie powinien, ale gdy wpiszę datę od ($searchtext) lub do ($searchtext2) lub obie nie zwraca żadnych wyników.

Daty w bazie są w formacie rrrr-mm-dd gg:mm:ss, ale dodałem %, więc nie powinno być z tym problemu.
Po wpisaniu
  1. echo "$searchtext $searchtext2"
pokazuje prawidłowe daty (wcześniej wpisane).

Będę wdzięczny za pomoc.
Go to the top of the page
+Quote Post
Zyx
post 9.12.2010, 08:20:03
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Wystarczy, że sobie odpowiesz na pytanie, co Ci generuje następujący kod w treści zapytania i będziesz wiedział, czemu nie działa:

Kod
'.%$searchtext%.'




--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
rafalekjan
post 9.12.2010, 11:11:39
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2010

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


Generuje datę w postaci rrrr-mm-dd, a % jest bo w bazie data jest razem z godziną.

Ten post edytował rafalekjan 9.12.2010, 11:21:26
Go to the top of the page
+Quote Post
CuteOne
post 9.12.2010, 12:24:39
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


1. Zamiast kombinować ustaw kolumnę time na TIMESTAMP'a (no i poczytaj na google jak tego używać w praktyce)smile.gif
2. Lub:
  1. WHERE main.time >= '{$search1}' AND main.time <= '{$search2}'

3. Lub (nie wiem czy zadziała ;p):
  1. WHERE main.time BETWEEN '{$searchtext}' AND '{$searchtext2}'
Go to the top of the page
+Quote Post
rafalekjan
post 9.12.2010, 14:30:35
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2010

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


Nic to nie zmieniło.

Kiedy wpisuję jakiekolwiek ograniczenie datowe nie wyrzuca wyników:


Dla upewnienia dane w tabeli mają strukturę:

I nawet po zmianie na timestamp nie zmieniło się wyszukiwanie.

Dane w tabeli:
Go to the top of the page
+Quote Post
Zyx
post 9.12.2010, 14:58:01
Post #6





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Zabrzmię może trochę totalitarnie, ale jak osoba ze 128 "Pomógł" pisze Ci, żebyś się przyjrzał temu, co wpisujesz, to Ty się przyglądasz i usuwasz wątpliwe elementy. I usuwasz ZARÓWNO znaki procenta, jak i znajdujące się obok nich KROPKI. Twoje uzasadnienie nie pokrywa się bowiem z rzeczywistością i tym, jak MySQL działa dla dat.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
rafalekjan
post 9.12.2010, 15:32:42
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2010

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


Ale przecież tak zrobiłem:
  1. if (($searchtext !='') and ($searchtext2 !='')){
  2. $where .="where main.time between '{$searchtext}' and '{$searchtext2}' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  3.  
  4. }
  5. else{
  6. if ($searchtext !=''){
  7. $where .="where time >= '{$searchtext}' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  8.  
  9. }
  10. else{
  11. if ($searchtext2 !=''){
  12. $where .="where time <= '{$searchtext2}' and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type";
  13.  
  14. }
  15. else{
  16.  
  17. $where .='where time > 0 and main.id_licznik=liczniki.id_licznik and '.$searchklient.'=liczniki.id_usera and '.$wyborprzelicz.'=liczniki.type';
  18. }
  19. }}
Go to the top of the page
+Quote Post
Zyx
post 9.12.2010, 15:42:48
Post #8





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


OK, widzę że nieco opornie to idzie. We wszystkich przypadkach doklejasz nadmiarowe kropki wraz ze zmiennymi do wartości, którą baza ma Ci sprawdzić. A to dlatego, że masz burdel w kodzie: raz używasz apostrof, innym razem cudzysłowów i się gubisz w tym, próbując wstawiać zmienne '.$foo.' do ciągów ograniczonych przez cudzysłowy i pewnie vice versa. A jeśli tak zrobisz, kropki stają się integralną częścią zapytania i są wysyłane do bazy. Zatem próbujesz dane liczbowe przyrównywać nie do np. 5, a do .5.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
rafalekjan
post 9.12.2010, 18:10:21
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 15.11.2010

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


Ok, działa po usunięciu wszystkich kropek.
Więc kiedy mogę je stosować a kiedy nie? Teraz wszędzie zrobiłem pojedyncze cudzysłowy i działa bez kropek.
Go to the top of the page
+Quote Post
Zyx
post 9.12.2010, 19:21:27
Post #10





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Kropka to operator łączenia ciągów tekstowych i stosujesz je wtedy, kiedy chcesz połączyć dwa ciągi tekstowe, a to możesz zrobić jedynie będąc aktualnie poza ciągiem tekstowym. Apostrof nie zamyka ciągu otwartego cudzysłowem i vice versa.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
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: 25.04.2024 - 15:36