Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Pobieranie daty z bazy danych
derecyori
post 27.03.2011, 13:03:23
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.

Go to the top of the page
+Quote Post
darko
post 27.03.2011, 13:06:14
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.
Go to the top of the page
+Quote Post
derecyori
post 27.03.2011, 13:19:09
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 9.04.2008

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


  1. $wynik = mysql_query ("SELECT * FROM zmarly WHERE id='$nr'");
  2. if ($rekord = mysql_fetch_array ($wynik)) {
  3. if (!empty($rekord[4])) echo 'Data powstania: '.date("d-m-Y", strtotime($rekord[4]));
  4. }


Co do powodów to istnieją dwa. Pierwszy to estetyka a drugi życzenie klienta. Niestety ten drugi jest nie do przeskoczenia sciana.gif
Go to the top of the page
+Quote Post
darko
post 27.03.2011, 13:33:48
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.
Go to the top of the page
+Quote Post
Valdi_B
post 27.03.2011, 14:20:35
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.
Go to the top of the page
+Quote Post
derecyori
post 27.03.2011, 14:39:19
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.
Go to the top of the page
+Quote Post
Valdi_B
post 27.03.2011, 15:35:19
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.
Go to the top of the page
+Quote Post
derecyori
post 27.03.2011, 15:51:25
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 questionmark.gif W ciągu tego tygodnia już 2-krotnie zmienił nazwy. Zazwyczaj korzystam z mysql_fetch_assoc bo w ten sposób kod jest czytelniejszy i prostszy w edycji. Ale tym razem nie mogę.

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ąć.
Go to the top of the page
+Quote Post
darko
post 27.03.2011, 17:09:56
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:
  1. $date = '1810-10-01';
  2. $tmp = explode("-", $date);
  3. $new_date = $tmp[2] . '-' . $tmp[1] . '-' . $tmp[0];
  4. echo $new_date;


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
SUICIDE
post 12.04.2016, 21:44:38
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.

  1. $query = "SELECT * FROM uslugi WHERE pesel='$pesel' ";
  2. $result = mysql_query($query) OR die(mysql_error());
  3. $wiersz = mysql_fetch_array($result);
  4. IF (mysql_num_rows($result) ){
  5.  
  6. $string = $wiersz['data'];
  7. $data = strtotime($string);
  8. $data = $data + (60*60*24*30);
  9. }


-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
Go to the top of the page
+Quote Post
nospor
post 12.04.2016, 21:46:56
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

Go to the top of the page
+Quote Post
SUICIDE
post 12.04.2016, 21:55:43
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
Go to the top of the page
+Quote Post
nospor
post 12.04.2016, 21:58:36
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

Go to the top of the page
+Quote Post
SUICIDE
post 12.04.2016, 22:02:20
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.
Go to the top of the page
+Quote Post
nospor
post 12.04.2016, 22:03:35
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

Go to the top of the page
+Quote Post
SUICIDE
post 12.04.2016, 22:06:00
Post #16





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 31.10.2012
Skąd: Gorzów Wlkp

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


  1. $query = "SELECT * FROM uslugi WHERE pesel='$pesel' ";
  2. $result = mysql_query($query) OR die(mysql_error());
  3. $wiersz = mysql_fetch_array($result);
  4. IF (mysql_num_rows($result) ){
  5.  
  6. $string = $wiersz['data'];
  7. $data = strtotime($string);
  8. $data = $data + (60*60*24*30);
  9. mysql_query("UPDATE uslugi SET data='$data' WHERE pesel='$pesel'");
  10. }
Go to the top of the page
+Quote Post
com
post 12.04.2016, 22:07:47
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 smile.gif włącz sobie błędy wink.gif
Go to the top of the page
+Quote Post
nospor
post 12.04.2016, 22:07:55
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 wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
com
post 12.04.2016, 22:22:57
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 tongue.gif
Go to the top of the page
+Quote Post
SUICIDE
post 13.04.2016, 17:58:58
Post #20





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 31.10.2012
Skąd: Gorzów Wlkp

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


  1. $query = "SELECT * FROM uslugi WHERE pesel='$pesel' ";
  2. $result = mysql_query($query) OR die(mysql_error());
  3. IF (mysql_num_rows($result) ){
  4. mysql_query("UPDATE uslugi SET data=DATE_ADD(data,INTERVAL 30 DAY) WHERE pesel='$pesel'");
  5. }



Próbowałem też w taki sposób. Według podpowiedzi smile.gif

Kolumne data zmieniłem z varchar na DATE
Ale też nie działa.

Ten post edytował SUICIDE 13.04.2016, 18:07:08
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: 15.05.2025 - 07:49