Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Maleńki problem z wykresem
Forum PHP.pl > Forum > PHP
damianprz

Pewien skrypt pewnego Pana generuje wykresy takie jak ten pierwszy wykres na screenie
Trzeba tylko w pewnym pliku podać odpowiednie dane
I tak ten pomarańczowy wykres miał zapodane takie coś:

  1. $pytanko="SELECT data.data FROM data
  2. INNER JOIN produkty ON (data.id=produkty.id_daty)
  3. WHERE produkty.id_towaru='2' ";
  4. $rezultat = mysql_query($pytanko)
  5. or die("Błąd zapytania");
  6. $ilejest = mysql_num_rows($rezultat);
  7.  
  8. $pytanko2="SELECT produkty.popyt FROM produkty
  9. INNER JOIN data ON (produkty.id_daty=data.id)
  10. WHERE produkty.id_towaru='2' ";
  11. $rezultat2 = mysql_query($pytanko2)
  12. or die("Błąd zapytania");
  13. $ilejest2 = mysql_num_rows($rezultat2);
  14.  
  15. $nazwy = mysql_fetch_array($rezultat);
  16. $wartosci = mysql_fetch_array($rezultat2);


Otrzymuje też wyniki:
  1. ilejest: 9
  2. ilejest2: 9


Moja struktura bazy danych wygląda następująco:
(chodzi o tabele data i produkty)


Jak widać w zapytaniu chcę pokazać jakoś popyty dla produktu akurat o Id=2
ale wyświetla mi tylko pierwszą datę i pierwszy popyt dla towaru id=2
W tabeli produkty mam 9 pozycji dla towaru o Id=2

id_daty ...id_towaru... popyt
1.......... 2 ............20
2 ..........2 ............25
3 ..........2 ............15
4 ..........2 ..............5
5 ..........2 ............15
6 ..........2 ............10
7 ..........2 ............15
8 ..........2 ............15
9 ..........2 ............15

Jak pokazać wszystkie daty i wszystkie popyty dla danego id towaru?
Fixus
Powinieneś się uczyć na poprzednich przykładach ponieważ odczytanie wielu wyników z jednego zapytania sam osobiście ci zapodałem smile.gif

Pokaże ci na prostym przykładzie który możesz sobie potem dowolnie dostosować.

  1. // zapytanie sql
  2. $sql = "select * from tabela";
  3.  
  4. // wykonanie zapytania
  5. $result = mysql_query($sql);
  6.  
  7. // odczytanie i wyswietlenie WSZYSTKICH wyników
  8. while($item = mysql_fetch_array($result) {
  9. echo $item['jakies_pole']."<br />";
  10. }


parę słów wyjaśnień. Wykonać zapytanie umiesz

Wynik zapytania ($result) odczytujesz po przez pętle która czyta wiersz po wierszu z tabeli

Dostęp do konkretnych pól masz po przez
  1. $item['jakies_pole']


gdzie 'jakies_pole' to nazwa kolumny w twojej tabeli

z tego co widzę w twoim przykładzie wystarczy, że $nazwy i $wartosci odczytasz iteracyjnie

mam nadzieję, że to pomogło
damianprz

  1. while($item = mysql_fetch_array($result) {
  2.  
  3. echo $item['jakies_pole']."<br />";
  4.  
  5. }


Tyle że ja nie chce wyświetlić tych tabel tylko pod $nazwy i $wartosci podpiąć ciągi odpowiednio dat i popytów

$nazwy i $wartosci to tabele
mysql_fetch_array($rezultat)

rezultat to wynik kwerendy

a kwerenda to SELECT...


  1. $pytanko="SELECT data.data FROM data
  2. INNER JOIN produkty ON (data.id=produkty.id_daty)
  3. WHERE produkty.id_towaru='2' ";
  4. $rezultat = mysql_query($pytanko)
  5. or die("Błąd zapytania");
  6. $nazwy = mysql_fetch_array($rezultat);


w którym miejscu mam podpiąć while?

Wiem ciężko kapujący jestem ale proszę o pomoc
Fixus
dobra już rozumiem w czym masz problem smile.gif

nie jestem specem od sql dlatego moje rozwiązanie może być nieoptymalne ale będzie działać

  1. $sql = "select * from produkty";
  2. $result = mysql_query($sql);
  3. while($item = mysql_fetch_array($result)) {
  4. $sql2 = "select * from towary where id = '".$item['id_towaru']."'";
  5. $result2 = mysql_query($sql2);
  6. $nazwy = mysql_fetch_array($result2);
  7. $nazwa = $nazwy['nazwa'];
  8.  
  9. $sql3 = "select * from data where id = '".$item['id_daty']."'";
  10. $result3 = mysql_query($sql3);
  11. $daty = mysql_fetch_array($result3);
  12. $data = $daty['data'];
  13.  
  14. $popyt = $item['popyt'];
  15. echo "Nazwa towaru $nazwa, jego data to $data, a popyt to $popyt;"
  16. }


mam nadzieję, że pomogło
thek
Jeśli chcesz dla każdego rekordu podpiąć odpowiadającą mu datę to musisz jedynie zrobić LEFT JOIN z tabelą dat. Tyle że nie jako pierwszą. Dla Ciebie są istotne rekordy tyczące produktu i to do niego dołączasz daty rozpoznane po ich id. Miałeś to już wykonane w swoim zapytaniu, ale zapomniałeś dodać kolumny do wyniku.
  1. $pytanko2="SELECT produkty.popyt FROM produkty INNER JOIN data ON (produkty.id_daty=data.id) WHERE produkty.id_towaru='2' ";

Wystarczyło byś dopisał data.data obok produkty.popyt smile.gif
  1. $pytanko2="SELECT produkty.popyt, data.data FROM produkty INNER JOIN data ON (produkty.id_daty=data.id) WHERE produkty.id_towaru='2' ";

lub jeśli trzymać się LEFT JOIN (ja zamieniłem kolejność kolumn by najpierw daty były a potem popyt)
  1. $pytanko2="SELECT d.data, p.popyt FROM produkty p LEFT JOIN data d ON p.id_daty=d.id WHERE p.id_towaru='2' ";

To Ci zwróci ciąg wierszy z datą i popytem w tym dniu dla produktu o id_towaru równym 2

EDIT: Swoją droga to nie musisz mi za każdym razem dawać pomógł. Raz by w zupełności wystarczyło smile.gif W tematach teraz jest przez to "kolorowanka" winksmiley.jpg
damianprz
Cytat(Fixus @ 29.08.2009, 18:18:50 ) *
dobra już rozumiem w czym masz problem smile.gif

nie jestem specem od sql dlatego moje rozwiązanie może być nieoptymalne ale będzie działać

  1. $sql = "select * from produkty";
  2. $result = mysql_query($sql);
  3. while($item = mysql_fetch_array($result)) {
  4. $sql2 = "select * from towary where id = '".$item['id_towaru']."'";
  5. $result2 = mysql_query($sql2);
  6. $nazwy = mysql_fetch_array($result2);
  7. $nazwa = $nazwy['nazwa'];
  8.  
  9. $sql3 = "select * from data where id = '".$item['id_daty']."'";
  10. $result3 = mysql_query($sql3);
  11. $daty = mysql_fetch_array($result3);
  12. $data = $daty['data'];
  13.  
  14. $popyt = $item['popyt'];
  15. echo "Nazwa towaru $nazwa, jego data to $data, a popyt to $popyt;"
  16. }


mam nadzieję, że pomogło


Twój kod (z drobną poprawką - daty zamieniłem na wartosci, bo plik generujący wykres ma dostać 2 ciągi znaków o równej ilości bo w innym wypadku wywala bład, te ciagi znaków mają być pod zmiennymi $nazwy i $wartosci, a były $daty)

  1. $sql = "select * from produkty";
  2. $result = mysql_query($sql);
  3. while($item = mysql_fetch_array($result))
  4. {
  5. $sql2 = "select * from towary where id = '".$item['id_towaru']."'";
  6. $result2 = mysql_query($sql2);
  7. $nazwy = mysql_fetch_array($result2);
  8. $nazwa = $nazwy['nazwa'];
  9. $sql3 = "select * from data where id = '".$item['id_daty']."'";
  10. $result3 = mysql_query($sql3);
  11. $wartosci = mysql_fetch_array($result3);
  12. $data = $wartosci['data'];
  13. $popyt = $item['popyt'];
  14.  
  15. echo "Nazwa towaru ".$nazwa.", jego data to ".$data.", a popyt to ".$popyt." <BR>";
  16.  
  17. };


dał takie wyniki z echo:

  1. Nazwa towaru drewno, jego data to 2009-07-01, a popyt to 10
  2. Nazwa towaru srubki, jego data to 2009-07-01, a popyt to 20
  3. Nazwa towaru klej, jego data to 2009-07-01, a popyt to 20
  4. Nazwa towaru farba, jego data to 2009-07-01, a popyt to 10
  5. Nazwa towaru drewno, jego data to 2009-07-02, a popyt to 15
  6. Nazwa towaru srubki, jego data to 2009-07-02, a popyt to 25
  7. Nazwa towaru klej, jego data to 2009-07-02, a popyt to 15
  8. Nazwa towaru farba, jego data to 2009-07-02, a popyt to 20
  9. Nazwa towaru drewno, jego data to 2009-07-03, a popyt to 5
  10. Nazwa towaru srubki, jego data to 2009-07-03, a popyt to 15
  11. Nazwa towaru klej, jego data to 2009-07-03, a popyt to 25
  12. Nazwa towaru farba, jego data to 2009-07-03, a popyt to 5
  13. Nazwa towaru drewno, jego data to 2009-07-06, a popyt to 10
  14. Nazwa towaru srubki, jego data to 2009-07-06, a popyt to 5
  15. Nazwa towaru klej, jego data to 2009-07-06, a popyt to 15
  16. Nazwa towaru farba, jego data to 2009-07-06, a popyt to 35
  17. Nazwa towaru drewno, jego data to 2009-07-07, a popyt to 5
  18. Nazwa towaru srubki, jego data to 2009-07-07, a popyt to 15
  19. Nazwa towaru klej, jego data to 2009-07-07, a popyt to 25
  20. Nazwa towaru farba, jego data to 2009-07-07, a popyt to 15
  21. Nazwa towaru drewno, jego data to 2009-07-08, a popyt to 10
  22. Nazwa towaru srubki, jego data to 2009-07-08, a popyt to 10
  23. Nazwa towaru klej, jego data to 2009-07-08, a popyt to 10
  24. Nazwa towaru farba, jego data to 2009-07-08, a popyt to 10
  25. Nazwa towaru drewno, jego data to 2009-07-09, a popyt to 15
  26. Nazwa towaru srubki, jego data to 2009-07-09, a popyt to 15
  27. Nazwa towaru klej, jego data to 2009-07-09, a popyt to 25
  28. Nazwa towaru farba, jego data to 2009-07-09, a popyt to 25
  29. Nazwa towaru drewno, jego data to 2009-07-10, a popyt to 15
  30. Nazwa towaru srubki, jego data to 2009-07-10, a popyt to 15
  31. Nazwa towaru klej, jego data to 2009-07-10, a popyt to 25
  32. Nazwa towaru farba, jego data to 2009-07-10, a popyt to 25
  33. Nazwa towaru drewno, jego data to 2009-07-13, a popyt to 10
  34. Nazwa towaru srubki, jego data to 2009-07-13, a popyt to 15
  35. Nazwa towaru klej, jego data to 2009-07-13, a popyt to 20
  36. Nazwa towaru farba, jego data to 2009-07-13, a popyt to 18


oraz wykres, który niestety nadal jest zły


thek
Jak mniemam, po prostu do konkretnych tablic musisz tylko podpiąć wyniki zapytań... Mogę się jednak mylić. Jeśli jednak dobrze kombinuję to powiązano to tak... Musisz mieć dwie tablice o równej długości. Pierwsza przechowuje bowiem "nazwę kolumny", a druga "wartość kolumny" smile.gif Wystarczy tylko napisać zapytanie, które zwróci wynik. Potem w pętli wrzucisz je do dwóch tablic i podepniesz jako dane do owego wykresu. Czyli po sprawdzeniu zawartości...
nazwy = (data1, data2, data3, data4)
wartosci = (dane1, dane2, dane3, dane4)
I teraz wykres miałby 4 kolumny o wysokości słupków zgodnych z wartościami, i nazwach odpowiednich pod słupkami.
damianprz
.
.
.
.
.
.
about thek

  1. $pytanko2="SELECT d.data, p.popyt FROM produkty p LEFT JOIN data d ON p.id_daty=d.id WHERE p.id_towaru='2' ";


Pytanko 2 zwróci ciąg wierszy z datą i popytem dla towaru nr 2
ale chodzi o to że plik generujący wykres działa tak, że ma otrzymać 2 ciągi znaków o równej liczbie

  1. $nazwy = mysql_fetch_array($rezultat);
  2. $wartosci = mysql_fetch_array($rezultat2);


I np w $nazwy trzeba wczytać daty a w $wartosci wpisać wartości popytu

Wtedy wykres powinien się wygenerować poprawnie.

W pierwszym poście tego tematu na samej górze jest wykresik, ten pomarańczowy
Został wygenerowany dla danych:

  1. $nazwy=array ('Mietek','Krzysiek','Dyzio','Mietek','Krzysiek','Dyzio','Janek','Jarek','Genek');
  2. $wartosci=array ('1','90','45','10','115','60','11','23','59');


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

Ale jak widzisz Fixus zaproponował jakiś kod
Ja też na początku coś próbowałem ale nic z tego nie wychodzi
Jestem chyba po prostu tępy

Musisz mieć dwie tablice o równej długości. Pierwsza przechowuje bowiem "nazwę kolumny", a druga "wartość kolumny" smile.gif Wystarczy tylko napisać zapytanie, które zwróci wynik. Potem w pętli wrzucisz je do dwóch tablic i podepniesz jako dane do owego wykresu.

Jak dla mnie to troche skomplikowane
Nic z tym nie wymodzę
thek
To pomyśl tak... Skoro moja tablica zwróci Ci to co potrzebujesz, ale niejako w jednym to można to rozwiązać na dwa sposoby... Albo robisz dwa razy to samo zapytanie i za każdym razem usuwasz z zapytania jedną z pozycji tuż po SELECT albo kombinujesz w inny sposób winksmiley.jpg
Powiem Ci tylko, że choć ten drugi jest optymalniejszy, to nie ma aż tak wielkiej różnicy smile.gif
Dlaczego?
Ano pokażę Ci dając gotowe zapytania:
Zapytania do Rozwiązania nr1 (kasacja odpowiedniej kolumny):
  1. SELECT d.DATA FROM produkty p LEFT JOIN DATA d ON p.id_daty=d.id WHERE p.id_towaru='2'

  1. SELECT p.popyt FROM produkty p LEFT JOIN DATA d ON p.id_daty=d.id WHERE p.id_towaru='2'

Zapytania do Rozwiązania nr2 (przebudowa tak jak powinno to wyglądać):
  1. SELECT d.DATA FROM produkty p LEFT JOIN DATA d ON p.id_daty=d.id WHERE p.id_towaru='2'

  1. SELECT popyt FROM produkty WHERE p.id_towaru='2'
Różnica to pozbycie się tak naprawdę tylko JOIN LEFT. Obie wersje bowiem zwrócą to samo. By mieć pewność, można jeszcze na wszelki wypadek do każdego z nich dać ORDER BY id_daty winksmiley.jpg
damianprz
Próbowałem ale nie chodzi
Pliki do generowania wykresu są tutaj ---->WYKRESY.RAR
Fixus
możesz opisać co Ci nie chodzi ?
nawet nie wiem co ci teraz doradzić tongue.gif
damianprz
damianprz
post Dzisiaj, 00:02
Post #6

Napisałem jakiego kodu użyłem, tzn tego co zaproponowałeś i napisałem że echo ładnie wygenerowało wszystkie dane tylko że wykres (jak na załączonym screenie) nadal jest zły

ZArzuciłem te pliki co generują wykres w Wykres.rar

dane.inc.php - tu należy podać dane i tylko ten plik sie edytuje
index.php - a tu skrypt generuje wykres

W pliku dane.inc.php należy w miejscu

$nazwy = mysql_fetch_array($rezultat);
$wartosci = mysql_fetch_array($rezultat2);

zapodać 2 ciągi wyrażeń, w jednym daty a w drugim wartości popytów dla tych dat
warunek jest taki że i $nazwy i $wartosci muszą mieć tyle samo pozycji
thek
Dobrze mówiłem... Przyjmujesz jako parametry 2 tablice. W pierwszej zapodajesz label dla wykresu a w drugiej wartości. Problem masz w tym, że wywalasz do tych tablic pojedyncze wywołanie mysql_fetch_array co jest błędem. Musisz wypełnić wpierw całą tablicę wartości i dat zanim zwrócisz ją do wykresu.czyli
  1. $query = mysql_query( 'SELECT d.data, p.popyt FROM produkty p LEFT JOIN data d ON p.id_daty=d.id WHERE p.id_towaru='.id_towaru );
  2. $daty= array();
  3. $wartosci = array();
  4. if( $query ) {
  5. while( $row = mysql_fetch_array( $query ) ) {
  6. $daty[] = $row['data'];
  7. $wartosci[] = $row['popyt'];
  8. }
  9. }
i dopiero po tym podawaj tablicę dat i wartości do wykresu jako parametry. Wykres jest prostym skryptem i nawet z GD nie korzysta. Zabezpieczenie pliku też jest mocno żartobliwe dla kogoś kto choć w podstawowej wersji zna PHP. Wystarczy tylko w konkretnym miejscu usunąć linijkę i zabezpieczenie "złamane". Błędem jaki robiłeś jest to, że mysql_fetch_* zwraca zawsze tylko jeden rekord z wyników, a nie wszystkie potrzebne, a skrypt wymaga wszystkich za jednym zamachem. Sam kiedyś zrobiłem identyczny skrypt koleżance, tyle że nie robił on wykresów, ale dane pobierał z zewnętrznego pliku i zapisywałem je w nim jako Array, który potem include'owałem. Ty i tak będziesz musiał jeszcze ten kod wyświetlający zaimplementować w swój kod. Tyle że przy Twojej wiedzy także z tym będziesz miał problem. Zamiast bowiem sam pomyśleć od razu lecisz z pytaniem na forum. Spróbuj wpierw sam rozgryźć. Jeśli nie wydumasz po dniu prób to może wtedy pytaj. Kompletnie nie rozumiesz bowiem php, co widać po tym temacie. Nie zerknąłeś nawet do pliku dane.inc.php, gdzie jak byk widać co jest potrzebne jako dane do wykresu i wystarczy tam tylko podmienić dane by zmienić wykres. Na razie to wygląda tak, że ja i ktoś z innego forum Ci dosłownie większość magisterki od strony kodu php zrobiłem. Dlatego zwracaj się z poważnymi problemami, a nie każdym jak leci bo nikt za Ciebie nie ma zamiaru jej zrobić. Także ja. Mogę pomagać do pewnego stopnia, ale póki co wygląda to tak, że rzucasz problem, czekasz na rozwiązanie, coś robisz (to się chwali akurat), ale jeśli przez pół godziny Ci nie idzie to lecisz zaraz z pytaniem tutaj. Czasem niepotrzebnie. Teraz zachciałeś mieć jeszcze wykres którego nie umiesz nawet danymi wypełnić w sposób prosty, choć wcale nie jest to trudne.
damianprz
Rozumiem Twoje zdenerwowanie, ale ja nie mam za bardzo już czasu, żeby myśleć po 3 dni nad 1 zagadnieniem. Jak widać mam nie za dużą wiedzę i pewnie z tego myślenia nie wiele by wynikło, a na studiowanie teraz książek z PHP nie mam czasu. Ogólnie mam taką sytuację, że późno pisze prace i bronie się we wrześniu ale nie swojej winy.

Cytat
Nie zerknąłeś nawet do pliku dane.inc.php, gdzie jak byk widać co jest potrzebne jako dane do wykresu i wystarczy tam tylko podmienić dane by zmienić wykres.

Jak nie zerknąłem jak cały czas pisałem że w tym pliku właśnie trzeba podmienić $wartosci i $nazwy na swoje.

Cytat
Ty i tak będziesz musiał jeszcze ten kod wyświetlający zaimplementować w swój kod. Tyle że przy Twojej wiedzy także z tym będziesz miał problem.

Ale autor skryptu pozwolił z niego korzystać pod warunkiem że nie będzie usunięta wzmianka że to jego
Wystarczy mi tylko teraz wygrenerować linki jak w przypadku przeglądu tabelarycznego dziennego popytu danego towaru

  1. for($i=1; $i<=$ile; $i++) {
  2. $wiersz = mysql_fetch_array($rezultat3);
  3. echo '<font size=5><A HREF="przeglad_2.php?id='.$i.'">towar o id:'.$i.'</a>';
  4. echo " i o nazwie: ".$wiersz['nazwa']."<BR>";
  5. };


i następnie w pliku dan.inc.php

  1. $zapytanie="SELECT d.data, p.popyt FROM produkty p LEFT JOIN data d ON p.id_daty=d.id WHERE p.id_towaru='2'";


tę dwójkę zamienić na $_GET['id']

Cienki z PHP jestem, ale dzięki Tobie wiele się nauczyłem, szczególnie to polecenie

  1. UPDATE zapasy z LEFT JOIN (SELECT id_towaru, round(avg( popyt ),2) AS srednia, round(STD( popyt ),2) AS odchylenie FROM produkty GROUP BY id_towaru) p
  2. ON z.id_towaru = p.id_towaru
  3. SET z.srednia = p.srednia, z.odchylenie = p.odchylenie


czy

  1. SELECT t.nazwa, p.id_towaru, round(avg(p.popyt),2) AS srednia, round(std(p.popyt),2) AS odchylenie
  2. FROM Produkty p
  3. LEFT JOIN Towary t ON p.id_towaru = t.id
  4. GROUP BY p.id_towaru


zrobiły na mnie wrażenie bo bez żadnych pętli wykonują działania na tylu rekordach ile jest w tabeli.
PHP miałem na studiach mało, a nie zdecydowałem się żeby dokształcić się na własną rękę.
Tematyka mi się podoba i w związku z tym mam pytanie. Jak najszybciej nauczyć się "praktycznego" PHP, jakieś kursy w internecie może są? albo jakaś fajna książka?
Fixus
po prostu wybieraj sobie zagadnienia które chcesz zaprogramować i zaprzyjaźnij się z google i dokumentacją. Tak jest chyba najlepiej.

Zresztą kursuów, snippetów itp itd w necie jest bardzo dużo. Wystarczy poszukać parę minut
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.