Zobacz temat
Dane z bazy po spelnieniu warunku czasu.
|
|
MeTeo |
Dodany dnia 22.01.2008 18:49:46
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
Witam. Myślę nad pewną modyfikacją i będzie mi potrzebne zastosowanie zgodności czasu. Do rzeczy: W modzie (postać formularza) wpisuję datę i godzinę i daje zapisz. Na stronie głównej byłby skrypt, który wyświetla wynik z bazy jeśli jest spełniony warunek czasu. Tak więc jak dojdzie załóżmy godzina 21:30 dnia (załóżmy) 22.01.2008 - a to samo wpisałem w skrypcie to wtedy wyświetli te dane i będzie je wyświetlał przez 2-3 godziny. Do czego mi to potrzebne? Chcę rozbudować panel wyników i wykorzystać to jako "aktualnie trwa spotkanie". Tylko chodzi mi o to, jak zrobić takowe zapytanie? Czasu nie znalazłem w bazie danych. Z tego co pamiętam to czas jest pobierany z serwera... Pozdrawiam. PW od moderatora:
|
|
|
Wścibski Gość |
Dodany dnia 24.11.2024 22:29:48
|
Pan Kontekstualny Postów: n^x Data rejestracji: Zawsze |
|
IP: localhost | |
Grzes |
Dodany dnia 22.01.2008 19:39:52
|
Zaawansowany Postów: 1656 Pomógł: 42 Data rejestracji: 28.04.2005 20:28 |
Wpadłem tu tylko na chwile więc tylko krótko. Po wysłaniu formularza zbierz date i przekaż ją do funkcji mktime (http://www.php.net/manual/pl/ - tu jest opis, wpisz nazwe funkcji w szukajke) Utworzy Ci to znacznik czasu w formacie unixowym. Wrzuć to do tabeli do pola (typ int długość 10). Przy wiciąganiu danych z bazy skorzystaj z funkcji time - zwraca aktualną godzine a właściwie znacznik. Przykładowe zapytanie: pobierze rekordy których data jest większa od (aktualny czas - 7200 sekund) aktualny czas - 2h czyli te z ostatnich 2 godzin. Edytowane przez Grzes dnia 22.01.2008 19:40:07 Często najmądrzejszą odpowiedzią jest milczenie
|
|
|
MeTeo |
Dodany dnia 22.01.2008 20:54:57
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
Przeczytałem to 10 razy i zacząłem rozumieć Zastanawia mnie tylko jak zastosować funkcję mktime. Nie znalazłem tam też dokładnego kodu na to by przetworzył mi dana wartość. Znaczy się nie znalazłem bo dla mnie takie php to wyższa szkoła |
|
|
Grzes |
Dodany dnia 22.01.2008 22:54:07
|
Zaawansowany Postów: 1656 Pomógł: 42 Data rejestracji: 28.04.2005 20:28 |
W takim razie bierzemy się za opis tej funkcji. W manualu piszą tyle: int mktime ( int $godzina, int $minuta, int $sekunda, int $miesiąc, int $dzień, int $rok [, int $letni/zimowy] ) tłumacząć z polskiego na nasze wygląda to mniej więcej tak: zwrana liczba całkowita ; mktime(godzina, minuta, sekunda, miesiąc, dzień, rok, (nie wymagany parametr) czas letni/zimowy); Masz tej funkcji podać dane w/w a ona zwróci liczbę całkowitą - czas w standardzie unixowym. Zakładamy że mamy takie zmienne pochodzące z formularza: $a - dzień $b - miesiąc $c - rok $d - godzina (celowo obrałem inne nazwy zmienych bo wcale nie muszą nazywać się tak jak dane w nich zawarte choć kod jest czytelniejszy wtedy - urozmaicimy teraz to trochę). Funkcja jeszcze wymaga minuty i sekundy. Założymy sobie że będziemy zawsze przyjmowali że będzie to 0 minut i 0 sekund (okrągła godzina). Zapis powinien wyglądać tak: $czas = mktime($d, 0, 0, $b, $a. $c); Teraz tylko zawartość $czas wrzuć do bazy. Proste? ;) Często najmądrzejszą odpowiedzią jest milczenie
|
|
|
MeTeo |
Dodany dnia 22.01.2008 23:37:59
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
Czyli teraz z twojego polskiego przełożę na swój chłopski :) Mój notatniczek: W moim infusionie tworze pola odpowiedzialne za godzinę spotkania, lecz z podziałem na Dzień, miesiąc, rok, godzina (ew. minuty. Sekundy mogą być 0). Następnie w panelu sczytującym tworzę warunek... ale jak? Coś za zasadzie Tylko jak jest czas serwerowy? Bo tworząc z zmiennych zakładając Dobrze główkuję? Ma to prawo działać? Coś wspomniałeś o polu z bazy... Tak więc jak scalić wszystkie 5 pól w 1 zapytanie? Choć wydaje mi się, że to chyba zadziała ;) Proszę o odpowiedź :) Pozdrawiam. Edytowane przez MeTeo dnia 22.01.2008 23:39:45 |
|
|
Grzes |
Dodany dnia 23.01.2008 00:08:47
|
Zaawansowany Postów: 1656 Pomógł: 42 Data rejestracji: 28.04.2005 20:28 |
Jeśli chodzi o wyciągnięcie informacji to musisz mieć w tabeli to jedno dodatkowe pole. Tak będzie najprościej ponieważ sortując rekordy w tabeli będzie łatwiej wykonać to na jednym polu liczbowym niż na 5 rożnych. Dorzuć sobie pole datestamp (typ int, długośc 10) do tej tabeli a poniższy kod wyświetli Ci wybrane rekordy. (zwróć uwagę na pokolorowaną zmianę) Jeśli zaś chodzi o mktime to stosuj to podczas dodawania rekordu do tabeli. Dodawaj tak jak teraz dodajesz sobie datę jeśli tak Ci łatwiej ale do tego dodatkowego pola wrzuc wynik funkcji mktime. Wyjdzie na to że w jednym rekordzie data jest dwa razy zapisywana ale niech narazie tak będzie. Z czasem łatwiej będzie. Na przyszłość: Zamiast tych 5 pól można zastosować tylko to jedno datestamp. Dlaczego? Jeśli mamy już zapisaną date w tym formacie za pomocą funkcji strftime można wyodrębnić wszstkie elementy daty. Datę sofrmatowaną wyświetla też funkcja showdate (dostępna w fusionku). Definicja jej znajduje się w maincore.php. $tekst_z_data = showdate($zmienna_z_datą, "typ daty"); W miejsce typ daty można wpisać jedną z trzech predefiniowanych formatów: shortdate, longdate, forumdate lub ręcznie pobawić się w formatowanie ale tu odsyłam do manuala i definicji funkcji strftime - taka sama metoda formatowania obowiązuje. Starczy tego głupiego nawijania :P Zaraz kręćka dostaniesz :P Jeszcze tak zupełnie na marginesie, co do tego fragmentu: WHERE $czas = ... To zielone to nazwa pola w tabeli, znaku $ tu nie powinno być. Wiem, ze przez zmienną można by przekazać nazwę pola ale w tym przypadku nie o to biega, po prostu: WHERE czas = ...
Często najmądrzejszą odpowiedzią jest milczenie
|
|
|
MeTeo |
Dodany dnia 23.01.2008 00:19:31
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
Tylko jak zrobić z tych pięciu pól 1 zapytanie? Przykład: Mam sobie formularz taki Mam taki oto formularz. Każde pole to nowa zmienna (bo o to chyba chodziło). Tak więc jak zrobić by na końcu zamiast dodawać mi 5 pól robiło 1 - datestamp. Już jako tako zrozumiałem sens tego mktime ale dalej nie rozumiem jak wstawić je w formularz. Swoją drogą mój kod też jest chyba poprawny... Nie jestem pewny tego W zapytaniu bo coś napisałeś ale nie zrozumiałem :) Starczy tego głupiego nawijania :P Zaraz kręćka dostaniesz :P Dostałem już po 1 poście... Ale rozumiem, że moje pytanie nie jest na tyle banalne by otrzymać banalną odpowiedź :) Dzięki za dotychczasową pomoc i proszę o kolejną :) |
|
|
Grzes |
Dodany dnia 23.01.2008 00:22:43
|
Zaawansowany Postów: 1656 Pomógł: 42 Data rejestracji: 28.04.2005 20:28 |
Masz pewnie jakiś skrypt który przetwarza dane z formularza i dodaje je do bazy.. zgadza się? Jeśli dysponujesz tymi zmiennymi to przed dodaniem do bazy ich (INSERT INTO.. bla bla bla) wykonaj linijkę: i $jakas_zmienna dopisz do zapytania dodającego rekord do bazy. Edytowane przez Grzes dnia 23.01.2008 00:23:20 Często najmądrzejszą odpowiedzią jest milczenie
|
|
|
MeTeo |
Dodany dnia 23.01.2008 00:53:35
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
yyy... Żadnego skryptu do przetwarzania nie mam. Znaczy się budowa tego wygląda tak: W panelu admina wypełniam formularz z danymi i klikam button - dodaj. Po dodanie Wynik wyświetla się w panelu "nadchodzące spotkania" jednak gdy dojdzie czas tego spotkania (taki czas jak dałem w formularzu) mecz się ten w szerszych danych wyświetli w środkowym panelu z dopiskiem "aktualnie grany". Budowa tego jest taka sama jak innych infusionów mającyh na celu coś wyświetlania po wypełnieniu ;) Choćby panel powitalny... Wpisuje w PA i wyświetla na głównej ;) Tutaj przechodzi przez db... Ten mój kod jest zły? Nie przeszkadza mi to, że jest rozczłonkowany... Chociaż... Czy nie mógłbym zrobić 1 pola "data" a w nim wpisać datę w formie: 21, 15, 00, 01, 23. 2008 Tak samo definiuje mktime... Pole to wtedy by dodawało dane do datestamp Następnie w skrypcie pobierania przetworzyłbym dane z datestamp. Byłoby to oznaczone zmienna np "$czas" i potem byłoby: Tylko to na to samo wychodzi jak bym robił mój 1 sposób ;D Tyle, że tamten był prostszy... Tak więc czekam na odp. Czy tamten sposób nie zadziała, a jak nie to poradę jak go poprawić... Albo z kolei jak zrobić skrypt przetwarzający dane z formularza... Bo tego to kompletnie nie wiem ;) Domyślam się jakby to wyglądało ale z kwestii kodu nie mam pojęcia. No i teraz tak analizuje wcześniejsze posty i coś mnie zaintrygowało... Czy przypadkiem nie zadziała w ten sposób, że będzie wynik wyświetlony cały czas a zniknie po 2 godzinach od daty w formularzu? Ja to rozumiem tak: czyli tak więc gdy będzie Wynik się już wyświetlać nie będzie ale: Też spełnia warunek, a chodzi o to by kod był wyświetlany od godziny w formularzu przez 2 godziny... Te 2 godziny są ale od? :D Pozdrawiam |
|
|
Grzes |
Dodany dnia 25.01.2008 22:00:50
|
Zaawansowany Postów: 1656 Pomógł: 42 Data rejestracji: 28.04.2005 20:28 |
Nie kombinuj. Skoro dodajesz do bazy date w formie w jakiej masz to za pomocą phpmyadmina dodaj sobie pole datestamp (typ int dł. 10). W skrypcie przed wykonaniem zapytania INSERT wstaw linijkę: $czas = mktime... w wg schematu jaki opisywałem poprzednio. Tylko podaj tej funkcji datę którą otrzymujesz w formularza. W samym zapytaniu insert dopisz tam by dodało zawartość zmiennej $czas do pola datestamp. Teraz tam gdzie chcesz aby wyświetlane byly pozycje tylko z ostatnich 2h w zapytaniu SELECT dodaj w warunku WHERE to oczym piszesz WHERE datestamp>'".(time()-7200)."'" Teraz jaśniej napisałem? Nie wiem jak to inaczej opisać. Często najmądrzejszą odpowiedzią jest milczenie
|
|
|
MeTeo |
Dodany dnia 30.01.2008 17:39:56
|
Bywalec Postów: 880 Pomógł: 23 Ostrzeżeń: 2 Data rejestracji: 14.12.2005 19:38 |
Witam. EDIT: Problem częściowo rozwiązałem, szczegóły na dole Teraz już jestem bardziej przydatny gdyż już to robię ;) Niestety nie pisałbym tu gdybym nie miał problemów... Po primo - grzes, dałeś błąd w tej zmiennej... kropkę zamiast przecinka - nie mam pretensji ale podczas szukania błędów natknąłem się na to. Po 2 - Pisałeś bym wstawił mktime przed invert oraz dał by wynik został dodany do bazy... hmm... Jak dla mnie to to wykonałem. Poniżej zamieszczam fragment zmodyfikowanego extreme_warstat_admin z umieszczonymi fragmentami zaznaczonymi. Nie wstawiam całego kodu bo to bez sensu. A oto on: Wynik się dodaje lecz kolumna "warstats_czas" ma ciągle wartość "0". Ma ona parametry: Typ: INT, długość: 12 - tak 12 gdyż chyba chodzi o łączną liczbę wartość a zakładałeś bez minut, a ja minuty umieszczam. Zmieniłem - $czas na $stats_czas - datesmap na warstats_czas Pola w formularz są rozbite na minuty, godziny, miesiąc... Chyba będzie łatwiej... Proszę o instrukcje :) Dziękuję i pozdrawiam EDITED: Jednak postanowiłem się pobawić i... Stworzyłem jedną komórkę i wpisałem w nią format daty zgodnie z mktime czyli zamiast 02.02.2008 13:30 wpisałem Jako mktime i ładnie mi dodało do bazy wynik: Co jest też błędne bo time jest już 10 cyfrowy a mktime robi mi 9... Bynajmniej mi już coś generuje... Tylko, że ten skrypt będzie używany przez duże grono redaktorów a próbuje wszystko robić "głupoto odporne" tak więc potrzebuję sposobu albo na scalanie tych kilku zmiennych w 1 a potem wysłania jako mktime (no i gdzie to w tym kodzie wstawić) lub jeśli się da, to kilka pól dotyczyłoby 1 zmiennej. Tylko dane dodawałby się w kolejności... P.S Poza tym warunek z time generuje błąd Już mnie to powoli męczy... Edytowane przez MeTeo dnia 02.02.2008 14:10:22 |
|
Przejdź do forum: |