Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z obliczaniem daty/pobieraniem z bazy danych
Forum PHP.pl > Forum > Przedszkole
P4nch0
Witam,

Wiem, że jest mnóstwo tematów z tym problemem, przeglądam je próbuje na różne sposoby i nie kminię dlaczego wychodzi tak a nie inaczej..
W projekcie gry, po kliknięciu na ekran zapisuje się data kliknięcia.

Pobieram ją i chciałbym przy wczytywaniu danych do gry obliczyć ile minęło od dodania, ale dostaję jakieś dziwne liczby.. Mam dwa zapytania, chodzi mi o zapytanie o "Data"

  1. <?php
  2. /*Nagłówek pliku informujacy o tym, że dane będą przekazywane w formacie JSON (JavaScript Object Notation)
  3. - jest to format transferu danych, w praktyce wyglądać będzie on finalnie w następujacy sposób:
  4. [["66","Austria"],["65","Polska"],["64","Czechy"]]
  5. */
  6. header('Content-type: application/json; charset=UTF-8');
  7.  
  8. /*Załączenie pliku odpowiadającego za połączenie z bazą danych.*/
  9. require 'config.php';
  10. require_once 'user.class.php';
  11. $login = $_SESSION['login'];
  12.  
  13. // łączymy się z bazą danych
  14. if ($conn) {
  15.  
  16. // zapytanie do bazy danych
  17. $wynik = mysql_query("SELECT * FROM danemapa WHERE login = '$login'")
  18. or die("Błąd w zapytaniu!");
  19.  
  20. $czas = mysql_query("SELECT Data FROM danemapa WHERE login = '$login'")
  21. or die("Błąd w zapytaniu!");
  22.  
  23.  
  24. }
  25. else echo "Nie mogę połączyć się z bazą danych!";
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. $i=0;
  34. $j=0;
  35. $arr = array();
  36. $arrdata = array();
  37. $czasobecnie = date("Ymdhis");
  38.  
  39.  
  40.  
  41. while($res = mysql_fetch_row($wynik))
  42. {
  43. $arr[$i++]=$res;
  44.  
  45.  
  46.  
  47. }
  48.  
  49. while($res1 = mysql_fetch_row($czas))
  50. {
  51.  
  52.  
  53.  
  54.  
  55. $jednostka_czasu="godzin";
  56.  
  57. $tablica = array(minut=>60, godzin=>3600, dni=>86400, sekund=>1);
  58. $roznica = round(((strtotime($czasobecnie) - strtotime($res1)) / $tablica[$jednostka_czasu]));
  59.  
  60.  
  61. $arrdata[$j++]=$roznica;
  62.  
  63.  
  64.  
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71. header('Content-Type: application/json');
  72. echo json_encode($arr);
  73. echo json_encode($arrdata);
  74.  
  75. ?>



W bazie mam dwa rekordy zapisane w formacie:

20160115000001
20160118000001





A po załadowaniu pliku otrzymuję dziwne liczby i w dodatku te same dla obu rekordów:

[403665,403665]





Gdy ustawię datę na sztywno, wszystko działa..


  1. <?php
  2. $jednostka_czasu="dni";
  3.  
  4. $czasobecnie = date("Ymdhis");
  5. $res1 = "20160115000001";
  6.  
  7. $tablica = array(minut=>60, godzin=>3600, dni=>86400, sekund=>1);
  8. $roznica = round(((strtotime($czasobecnie) - strtotime($res1)) / $tablica[$jednostka_czasu]));
  9.  
  10.  
  11.  
  12. echo $roznica;
  13. ?>


Podejrzewam, że mam błąd w pobieraniu danych z bazy, może jest źle zapisywana.. prosze o pomoc w rozwikłaniu tego.
Pozdrawiam smile.gif
Riggs
W tablicy masz złe klucze. To nie są stałe a ciągi znaków zatem zamiast
  1. $tablica = array(minut=>60, godzin=>3600, dni=>86400, sekund=>1);
zrób
  1. $tablica = array('minut'=>60, 'godzin'=>3600, 'dni'=>86400, 'sekund'=>1);
i zadziała.
P4nch0
Dzięki za odpowiedź smile.gif

Spóbuję zmienić, aczkolwiek nie wiem czy to pomoże, wcześniej inną metodą próbowałem dzielić przez stałą liczbę i było to samo, poza tym jak przypiszę zmienną na stałe:

$res1 = "20160115000001";

zamiast pobierać z tablicy to działa.

Podejrzewam, że coś jest błędnie zapisane w tablicy, nie wiem czy powinno to być zapisane jakos specjalnie jako data..
nospor
Cytat
Podejrzewam, że coś jest błędnie zapisane w tablicy,
Zamiast podejrzewac to sprawdz.... czy tak ciezko zrobic var_dump?questionmark.gif

robisz: strtotime($res1)
a $res1 to $res1 = mysql_fetch_row($czas)
wiec tak, nie dziwota ze zle ci dziala. Zrob var_dump jak prosilem to zobaczysz co zawiera twoja zmienna zamiast tylko podejrzewac.
maly_swd
Dodatkowo zmień na:
$czasobecnie = date("YmdHis");
(wielka litera H)

Poczytaj też o:
SELECT TIMESTAMPDIFF(SECOND,'2007-12-30 12:01:01','2007-12-31 10:02:00');

now() - podstawia aktualną datę
Riggs
Testowałem tylko ten drugi przypadek (z datami na sztywno) i pokazało 5 dni czyli prawidłowo. Tak jak zauważył @nospor zrzuć dane z $res1 i zobaczysz co tam masz.
P4nch0
Ok, ok, nie trzeba od razu atakować, nie siedziałem dawno w PHP i nie pamiętałem komend które pomogą to sprawdzić, dzięki za sugestie.




Wynik w przypadku pobrania z bazy danych:

  1. array(1) {
  2. [0]=>
  3. string(14) "20160120095603"
  4. }
  5. array(1) {
  6. [0]=>
  7. string(14) "20160120095603"
  8. }
  9. array(1) {
  10. [0]=>
  11. string(14) "20160120095602"
  12. }

  1. Wynik w przypadku przypisania na sztywno:
  2. string(14) "20160118000001"
  3. string(14) "20160118000001"
  4. string(14) "20160118000001"

nospor
Nie pamietales tez o ECHO?

Tak, ja wiem co to zwraca. To mialo tobie pokazac co to zwraca...
mysql_fetch_array zwraca TABLICE a nie pojedyncza wartosc jak ty myslales. Musisz sobie teraz te wartosc z tej tablicy pobrac.

ps: przenosze
P4nch0
Próbowałem również przypisania:

  1. $datazapisu = $res1;


niestety nie pamiętam jak ją przypisać dokładniej.. Gdybym wiedział, pewnie bym nie pisał..

Możecie podpowiedzieć?
nospor
Manual php-> dzial TABLICE (Arrays) - letkura obowiazkowa

$res1[0]
P4nch0

Ahh kurcze, że nie pomyślałem o tym, dzięki za nakierowanie smile.gif





Witam ponownie, mam jeszcze problem z przekazaniem tego przez Ajax. Obecnie plik wygląda tak:

  1. <?php
  2. /*Nag��wek pliku informujacy o tym, �e dane b�d� przekazywane w formacie JSON (JavaScript Object Notation)
  3. - jest to format transferu danych, w praktyce wygl�da� b�dzie on finalnie w nast�pujacy spos�b:
  4. [["66","Austria"],["65","Polska"],["64","Czechy"]]
  5. */
  6. header('Content-type: application/json; charset=UTF-8');
  7.  
  8. /*Za��czenie pliku odpowiadaj�cego za po��czenie z baz� danych.*/
  9. require 'config.php';
  10. require_once 'user.class.php';
  11. $login = $_SESSION['login'];
  12.  
  13. // ��czymy si� z baz� danych
  14. if ($conn) {
  15.  
  16. // zapytanie do bazy danych
  17. $wynik = mysql_query("SELECT * FROM danemapa WHERE login = '$login'")
  18. or die("B��d w zapytaniu!");
  19.  
  20. $czas = mysql_query("SELECT Data FROM danemapa WHERE login = '$login'")
  21. or die("B��d w zapytaniu!");
  22.  
  23.  
  24. }
  25. else echo "Nie mog� po��czy� si� z baz� danych!";
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. $i=0;
  34. $j=0;
  35. $arr = array();
  36. $arrdata = array();
  37. $czasobecnie = date("YmdHis");
  38.  
  39.  
  40.  
  41.  
  42. while($res = mysql_fetch_row($wynik))
  43. {
  44. $arr[$i++]=$res;
  45.  
  46.  
  47.  
  48. }
  49.  
  50. while($res1 = mysql_fetch_row($czas))
  51. {
  52.  
  53. $datazapisu = $res1[0];
  54. //$datazapisu="20160118000001";
  55. $jednostka_czasu="godzin";
  56. $tablica = array(minut=>60, godzin=>3600, dni=>86400, sekund=>1);
  57. $roznica = round(((strtotime($czasobecnie) - strtotime($datazapisu))/$tablica[$jednostka_czasu]));
  58. var_dump($datazapisu);
  59.  
  60. $arrdata[$j++]=$roznica;
  61.  
  62.  
  63.  
  64. }
  65.  
  66.  
  67.  
  68.  
  69.  
  70. header('Content-Type: application/json');
  71. echo json_encode($arr);
  72. echo json_encode($arrdata);
  73.  
  74. ?>





W innym plik mam funkcję odbierającą dane Ajax:
  1. function startdanemapa(){
  2. $(document).ready(function(){
  3. $.ajax({
  4. type:"GET", /*Informacja o tym, że dane będą pobierane*/
  5. url:"startdanemapa.php", /*Informacja, o tym jaki plik będzie przy tym wykorzystywany*/
  6. contentType:"application/json; charset=utf-8", /*Informacja o formacie transferu danych*/
  7. dataType:'json', /*Informacja o formacie transferu danych*/
  8.  
  9. /*Działania wykonywane w przypadku sukcesu*/
  10. success: function(json) { /*Funkcja zawiera parametr*/
  11. Tablicawiersze = 0;
  12.  
  13.  
  14. for (var klucz in json)
  15. {
  16.  
  17.  
  18. var wiersz = json[klucz]; /*Kolejne przebiegi pętli wstawiają nowy klucz*/
  19. var idtile = wiersz[5];
  20. var tilex = wiersz[3];
  21. var tiley = wiersz[4] ;
  22. var layer = wiersz[6];
  23. var czasdod = wiersz[7];
  24.  
  25.  
  26. Tablica[klucz] = [idtile , tilex, tiley, layer, czasdod];
  27. Tablicawiersze += 1;
  28.  
  29. console.log(czasdod);
  30.  
  31. /*Ustalenie sposobu wyświetlania pobranych danych w bloku div*/
  32.  
  33.  
  34.  
  35.  
  36.  
  37. }
  38.  
  39. czasobecnie = json[0];
  40. console.log(czasobecnie);
  41. },
  42.  
  43.  
  44. /*Działania wykonywane w przypadku błędu*/
  45. error: function(blad) {
  46. alert( "Wystąpił błąd");
  47. console.log(blad); /*Funkcja wyświetlająca informacje
  48.   o ewentualnym błędzie w konsoli przeglądarki*/
  49. }
  50.  
  51. });
  52. });
  53.  
  54.  
  55.  
  56. };



I niestety wyrzuca allert o błędzie i w konsoli loguje:

Object { readyState: 4, getResponseHeader: .ajax/v.getResponseHeader(), getAllResponseHeaders: .ajax/v.getAllResponseHeaders(), setRequestHeader: .ajax/v.setRequestHeader(), overrideMimeType: .ajax/v.overrideMimeType(), statusCode: .ajax/v.statusCode(), abort: .ajax/v.abort(), state: .Deferred/d.state(), always: .Deferred/d.always(), then: .Deferred/d.then(), 11 więcej… }



Jakieś pomysły dlaczego?

Ok, poradziłem sobie rozbijając to zapytanie na dwa smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.