![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 9.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich,
pytanie moje dotyczy pobierania z bazy danych daty. W bazie mysql istnieje kolumna typu Date w formacie 0000-00-00. Pobierając z niej datę i konwertując poprzez date("d-m-Y", strtotime($rekord[4])) dla dat starszych niż 1900-01-01 otrzymuję wynik 1970-01-01. Rozwiązanie przy użyciu mysql DATE_FORMAT nie wchodzi w grę. P.S. Google i wyszukiwarka już sprawdzone, nie znajduję tego co mi jest potrzebne. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Dlaczego konwertujesz format YYYY-MM-DD na d-m-y ? Pokaż ten fragment kodu.
-------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 9.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Co do powodów to istnieją dwa. Pierwszy to estetyka a drugi życzenie klienta. Niestety ten drugi jest nie do przeskoczenia ![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
echo date('d-m-Y', strtotime('2011-03-26'));
// wynik 26-03-2011 Zobacz, co się kryje tutaj: print_r($rekord[4]); -------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie używaj funkcji strtotime, bo ona daje w wyniku tzw. UNIX timestamp, a więc obsługuje daty z epoki UNIX'a.
Właściwie to dziwi mnie, że "głupieje" dopiero przy datach przed 1900 r., bo powinna "zgłupieć" już przy dacie sprzed 1970 r. Do sformatowania daty korzystaj z funkcji MySQL. Zobacz stronę: http://dev.mysql.com/doc/refman/5.1/en/dat...-functions.html a na niej funkcję DATE_FORMAT(). MySQL obsługuje daty od 1000 r., więc z datami przed 1900 nie powinno być problemu. Uwaga: W ten sposób dostajesz datę jako string, ale w takim formatowaniu jak chciałeś i ew. sortowanie wg takiego stringu będzie nie w porządku kalendarzowym. Jeżeli chcesz, aby ta data była także kluczem sortowania, to prawdopodobnie: - na liście SELECT trzeba ująć kolumnę daty bez żadnej funkcji, - zrobić sort po tej "nieprzetworzonej" dacie. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 9.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Do Darko:
- $rekord[4] zawiera datę, w tym konkretnym przypadku jest to 1810-10-01. Gdy wyświetlam print-em wszystko jest prawidłowo dopiero date() miesza mi tą datę. Do Valdi_B: - Co do Unix timestamp to niestety już wiem. Ale czy jest inna możliwość niż DATE_FORMAT ? Nie chcę korzystać z tej opcji bo wymagało by to podania wszystkich pól z tabeli (SELECT id, DATE_FORMAT('data' ,'%Y-%m-%c') as data FROM tabela) a nie (SELECT * FROM tabela). Tabela ta jest jeszcze zmieniana (tzn. dodawane są nowe pola itp.) dlatego zależy mi by nie musieć za każdym razem gdy ktoś zmienia bazę edytować kodu w php. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Na początek - jak sformatować datę:
Datę z bazy danych dostajesz jako string, w formacie YYYY-MM-DD. Wystarczy "poprzestawiać" te kawałki (funkcjami operującymi na stringach) i masz string daty w takim formacie jak chcesz. Co do funkcji daty / czasu w PHP: Przyjrzałem się im i wszędzie tam jest mowa o UNIX timestamp, a więc w przypadku dat sprzed 1970 r. i przetwarzaniu ich tymi funkcjami wręcz oczekuj problemów. Co do Twojej "niechęci" do odejścia od "SELECT * ... ": Jeżeli mysql_fetch_array ciągnie wszystkie kolumny, a do właściwej kolumny "dobierasz się" przez numer w tablicy wynikowej, to: 1. Niepotrzebnie obciążasz serwer b.d. transmisją pełnych rekordów, podczas gdy naprawdę potrzebujesz tylko pewne pola. 2. Program zacznie się "wywalać" w razie zmian w kolejności kolumn. Zawsze jest ryzyko, że ktoś projektujący bazę dostawi nowe pole nie na końcu, tylko przed którąś kolumną, którą chcesz czytać. Aby program dalej chodził, musisz wszędzie pozmieniać numery pól na nowe. Prawda jest taka, że zawsze coś przeoczysz i będziesz czytać z tablicy poprzednie pole (a nie to, które chciałeś). Takie błędy są trudne do identyfikacji. Lekarstwem na to jest: 1. W mysql_fetch_array użyj parametru MYSQL_ASSOC. Wtedy (nawet w wariancie "SELECT * ...") właściwe kolumny ciągniesz "po nazwach", a nie "po numerach". 2. Jawnie podawać listę pól po SELECT. Przecież w kodzie PHP po odczycie danych z bazy i tak operujesz na określonych polach. Skoro w kodzie PHP odwołujesz się do konkretnych pól, to jest logiczne, że nazwy tych pól też powinieneś podać po SELECT. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 9.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Do Valdi_B:
- co do bazy danych to, że obciążam serwer niestety wiem. Tylko powiedz mi jakie jest rozwiązanie jeżeli osobnik zajmujący się bazą danych ciągle zmienia nazwy pól ![]() Dzięki wszystkim serdeczne za pomoc. Widzę, że zgodnie z uwagą Valdi_B zostaje mi napisanie funkcji przerabiającej stringa na potrzebny format. Temat można zamknąć. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Ok zapomnieliśmy o ograniczeniach timestampów, spróbuj tak:
-------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 31.10.2012 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Przyłączę się do tematu. W bazie mam 2 kolumny 1. pesel (int) 2. data (varchar) Mój formularz wprowadza numer pesel oraz aktualną datę rejestracji usług po przez NOW() Formularz chcę rozbudować tak, aby przedłużał czas ważności o 30 dni jeżeli dany pesel już w bazie istnieje.
-sprawdziłem czy dany pesel istnieje - Istnieje -pobrałem z bazy $wiersz['data']; w formacie 2016-04-12 20:00:00 -dodałem 30 dni. Ale niestety... Ten post edytował SUICIDE 12.04.2016, 21:44:53 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
To ze ty w php sobie dodasz 30 dni do daty to chyba nie oczekujesz ze samo w magiczn sposob doda sie tez do bazy?
Poza tym data to DATA i ma byc typu DATE a nie varchar -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 31.10.2012 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Nie nie. Spokojnie. Dalszej części kodu . Czyli wprowadzenia do bazy danych po prostu nie podałem tutaj.
Problem mi stwarza tutaj sama ta funkcja dodania tych 30 dni. Wcześniej kolumnę data miałem jako timestamp, ale niestety z pewnych powodów zależało mi aby niektóre pesele wprowadzone do bazy miały wartość kolumny daty = ' ' a timestamp i tak wprowadzał 0000-00-00 00:00:00 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
No to kurcze, chlopie,wyrazaj sie precyzyjnie... Jestes na forum troche czasu.... skad mamy wiedziec co znaczy 'ALe niestety....'
No masz teraz date w postaci sekund. W czym problem? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 31.10.2012 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Dobrze będę starał się być bardziej szczegółowy i precyzyjny.
Po napisaniu takiej instrukcji kodu, wraz z zapytaniem do bazy danych o zaaktualizowanie wartości daty dla danego peselu. Data nie została zaaktualizowana. Jest taka sama. Teraz zmieniłem na "DATE" Tak jak podpowiedziałeś. więc sprawdzę jak to zadziała teraz. |
|
|
![]()
Post
#15
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Kurcze.... Ale pokaz caly kod... skad mamy wiedziec co ty tam dalej napsules?!
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 31.10.2012 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
http://stackoverflow.com/a/2332688/4450917 nie prościej było zrobić to tak?
if nie IF ![]() ![]() |
|
|
![]()
Post
#18
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Pisalem ci juz,ze $data ma teraz postac sekund wiec wypadaloby ja skonwertowac do postaci Y-m-d
$data = date('Y-m-d H:i:s', $data); @com najprosciej to by bylo jednym zapytaniem na bazie ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
nospor a wcale nie mówię że nie
![]() |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 31.10.2012 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) ![]() ![]() |
Próbowałem też w taki sposób. Według podpowiedzi ![]() Kolumne data zmieniłem z varchar na DATE Ale też nie działa. Ten post edytował SUICIDE 13.04.2016, 18:07:08 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.05.2025 - 07:49 |