Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rysowanie wykresu czasu w PHP i HTML
Forum PHP.pl > Forum > PHP
Bejkrools
Witam, podsuńcie mi proszę jakiś pomysł na zaznaczenie czegoś na osi czasu. Rysujemy pionową oś czasu, od 9 do 21, z podziałką np. co pół godziny. W bazie mam teraz w rekordach pola [od] i [do]. I teraz jak przedstawić dane w sposób jak na ilustracji? Niebieskie fragmenty przerywanej linii oznaczają właśnie okresy od - do.

buliq
ale w czym? PHP i generowany obrazek czy JS?
SmokAnalog
Jeśli z animacją, to canvas. Jeśli bez, to PHP GD.
Kshyhoo
Cytat(Bejkrools @ 4.10.2013, 13:20:33 ) *
W bazie mam teraz w rekordach pola [od] i [do].

Pokaż te dane.
Bejkrools
Już prawie prawie, ale...

w docelowym miejscy wyświetlam:

  1. <img src="wykres_obsluga.php" />


czyli...

  1. <?php
  2. $image=imagecreatetruecolor(780,5);
  3. $white=imagecolorallocate($image,255,255,255);
  4. $red = imagecolorallocate($image, 255, 0, 0);
  5. imagefill($image,0,0,$white);
  6.  
  7. $zapytanie = mysql_query("SELECT * FROM tabela");
  8. if(mysql_num_rows($zapytanie) > 0)
  9. {
  10. while($u = mysql_fetch_assoc($zapytanie))
  11. {
  12. $x1 = ile_minut_minelo_od_9($u["czas_start"]);
  13. $x2 = ile_minut_minelo_od_9($u["czas_stop"]);
  14. imagefilledrectangle($image, $x1, 0, $x2, 3, $red);
  15. }
  16. }
  17.  
  18. header("Content-type: image/png");
  19. imagepng($image);
  20. ?>


Niestety, przeglądarka pokazuje pęknięty obrazek, więc coś jest nie tak. Sama pętla wydaje się prawidłowo dawać dane bo np:

  1. echo ile_minut_minelo_od_9($u["czas_start"])."-";
  2. echo ile_minut_minelo_od_9($u["czas_stop"])."<br>";


daje wyniki:

287-294
296-395
399-433
436-465
471-476
476-482

czyli jak najbardziej takie, jakie są potrzebne do określenia współrządnych.
nospor
Pekniety obrazek?? Moze bys tak wyrazal sie bardziej precyzyjniej?
Bejkrools
hmm...


Jak zakomentuje linie 7-16 to prawidłowo wyświetla się białe pole w odpowiednich rozmiarach.
SmokAnalog
Żeby wyłapać jaki to błąd, zakomentuj tę linię:
  1. //header("Content-type: image/png");

a następnie otwórz wykres_obsluga.php w przeglądarce. Wyświetli Ci się błąd. Popraw go i odśwież znowu. Jak zobaczysz same dziwne krzaczki to będzie znaczyło, że błąd został naprawiony. Wtedy możesz znowu odkomentować:
  1. header("Content-type: image/png");

I powinno śmigać smile.gif
Bejkrools
faktycznie, nie miałem include. Poprawiłem, ale dalej grafika jest uszkodzona i się nie wyświetla.

  1. <?php
  2. $image=imagecreatetruecolor(780,5);
  3. $white=imagecolorallocate($image,255,255,255);
  4. $red = imagecolorallocate($image, 255, 0, 0);
  5. imagefill($image,0,0,$white);
  6.  
  7. include "connection.php";
  8. include "functions.php";
  9. connection_local();
  10.  
  11. $zapytanie = mysql_query("SELECT * FROM tabela");
  12. if(mysql_num_rows($zapytanie) > 0)
  13. {
  14. while($u = mysql_fetch_assoc($zapytanie))
  15. {
  16. $x1 = ile_minut_minelo_od_9($u["czas_start"]);
  17. $x2 = ile_minut_minelo_od_9($u["czas_stop"]);
  18. imagefilledrectangle($image, $x1, 0, $x2, 3, $red);
  19. }
  20. }
  21.  
  22. header("Content-type: image/png");
  23. imagepng($image);
  24. ?>


jak dodam echo przez $x1 i $x2 wyświetla się prawidłowy ciąg znaków, co oznacza, że współrzędne są prawidłowo obliczane i przekazywane przez funkcje w postaci zwykłych liczb całkowitych, mniejszych niż szerokość $image.

Wygląda to tak, jakby biblioteka miała problem z instrukcjami w pętli. Może ktoś przetestować to dla podanych wartości?

OD DO
287 294
296 395
399 433
436 465
471 476
476 482

Ewentualnie jeszcze to jest funkcja. Prawidłowe dane wejściowe to dowolna data z godziną pomiędzy 9:00 a 21:00.

  1. function ile_minut_minelo_od_9($czas)
  2. {
  3. $czas = date("H:i:s",strtotime($czas));
  4. $czas_rozbicie = explode(":", $czas);
  5. $minuty = (($czas_rozbicie[0]*60)+$czas_rozbicie[1])-540;
  6. return $minuty;
SmokAnalog
Przeczytaj jeszcze raz mój poprzedni post i zastosuj się do niego.
Bejkrools
Cytat
�PNG  IHDR g��ySIDATh���1� @���y-L,�Ll���%��$0CU�<^1�:��O;���Z�M����H���GF@�Hh��ܙ IEND�B`�


tak aktualnie serwer php interpretuje plik z kodem php, z komentarzem przy header. Po usunięciu komentarza problem nie ustąpił. Zrobiłem to zanim napisałem poprzedni post.

SmokAnalog
To upewnij się czy nie masz żadnych znaków po zamknięciu <?php ... ?>. A dla takich skryptów jak obrazki, najlepiej wcale nie zamykaj bloku PHP (i oczywiście otwieraj go zaraz na początku pliku.
Bejkrools
Nie mam na początku żądnych pustych znaków, plik zaczyna się otwarciem bloku php, usunąłem też zamknięcie bloku. Nie pomogło :-(



Jeżeli w pętli zablokuje tylko wywołanie imagefilledrectangle to też nic nie pomaga. Dopiero blokada wywołania całej pętli wznawia poprawne wyświetlanie (białego, pustego pola). Jestem pewien, że biblioteka działa prawidłowo, bo wywołanie imagefilledrectangle ze stałymi parametrami (poza pętlą mysql) ale z warunkiem, że zastosuje komentarz blokowy na całej pętli, począwszy od zapytania mysql..
SmokAnalog
Te krzaczki które przesłałeś wskazują na to, że w obrazku nie ma błędu jako takiego. Czyli już się pogubiłem - co teraz otrzymujesz? Zepsuty obrazek czy niepełny obrazek? Przypuszczam, że to drugie. Sprawdź dokładnie zapytanie, przetestuj wartość:

A tak naprawdę to tę instrukcję z mysql_num_rows możesz usunąć, bo i tak w środku jest tylko pętla, która przy braku wyników tak czy inaczej wykona 0 iteracji.
Bejkrools
  1. var_dump(mysql_num_rows($zapytanie));
  2. //wynik: 287294296395399433436465471476476482int(6)

  1. //wynik: 287294296395399433436465471476476482bool(false)

  1. var_dump($zapytanie);
  2. //wynik: 287294296395399433436465471476476482resource(7) of type (mysql result)


Zapytaie jest prawidłowe, wyniki są oczekiwane. Tylko działanie nie takiej, jakbym chciał...

Grafika się nie wyświetla
SmokAnalog
To ja już nie wiem - z zakomentowanym image/png są krzaczki (czyli treść binarna) bez żadnych tekstowych wstawek (błędów), a z odkomentowanym obrazek i tak się nie wyświetla? Jakaś magia.

P.S. Błąd nie polega na tym, ale daj ten header jako pierwszą instrukcję, a nie tuż przed imagepng.
Kshyhoo
Pokaż, co trzyma zmienna $czas.
Bejkrools
Zauważyłem, że problem bezpośrednio leży w występowaniu include. Wszystkie funkcje i łączenie z bazą zrobiłem w jednym bloku PHP i jest OK...
nospor
Widac jeden z plikow ktory includujesz albo ma BOM albo pluje jakims innym nieporządanym znakiem
Bejkrools
Zgadza się, plik functions.php był formatowany "nie bez BOM" :-)
SmokAnalog
O ile nie domykasz bloku <?php ... ?> to może sobie mieć BOM. Dobrym zwyczajem jest nie domykać tego bloku w plikach, które nie produkują żadnego statycznego wyjścia.
nospor
@SmokAnalog no niestety to nie prawda.
Kazdy tekst ktory leci z pliku includowanego jest wyswietlany niezaleznie czy domykasz plik nadrzedny czy nie.
SmokAnalog
Ja już od 100 lat nie używałem plików z BOM, ale czy to nie jest wszystko jedno w takiej sytuacji?
  1. <?php
  2. // jakieś instrukcje
  3. // BOM

Przecież ten BOM nie zostanie wypluty, a błędu z tego co pamiętam też nie powoduje.
nospor
BOM jest dodawany na poczatku pliku a nie w jego srodku/koncu
Jesli zas masz na mysli BOM w includowanym pliku to on bedzie tez przed <?php i bedzie traktowany jak kazdy inny tekst przed <?php czyli poleci do przegladarki.
SmokAnalog
Aha, no to rzeczywiście. Zapomniałem, że to jest dodawane na początku - w takiej sytuacji rzeczywiście nie ma możliwości zignorowania tego. Teraz sobie przypomniałem, że BOM lubił mi psuć przekierowania. 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.