Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Wyświetlanie wyników
Forum PHP.pl > Forum > Przedszkole
-mczlowiek-
mam 2 tabele, w jednej znajduja sie dyscypliny (id, nazwa);
Druga tabela zyski - słada sie z pól : (id, profit, dyscyplina);

przykład dla tebeli dyscypliny:

+--+---------+
|id |nazwa....|
+--+---------+
|.1.|pilka......|
|.2.|kosz.....|

itd

tabela zyski:
+---+------------+-------+
|.id.|dyscyplina.|.profit.|
+---+------------+-------+
|.1.|.........1.......|.4.5...|
|.2.|.........1.......|.6,0...|
|.3.|.........2.......|.-4,0..|

itd

i teraz chće zrobić takie coś , że podsumuje mi to wszystko w taki sposób:

piłka : 10,5
kosz : -4,0
...

Jak to wykonać, proszę o pomoc.
Pozdrawiam
JoShiMa
Tak powinno być dobrze:
  1. SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z LEFT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY z.dyscyplina
mczlowiek
niestety, albo ja coś źle napisałem, albo nie wiem co jet grane, wyskakuje błąd:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/tktbet/ftp/dzialy/statystyki.php on line 7

  1. <?php 
  2. mysql_query("set names utf8");
  3. $sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z LEFT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY 
    z.dyscyplina"
    );
  4.  
  5.  
  6.  
  7. while ($w = mysql_fetch_array($sql)) {
  8. echo ($w['nazwa']);
  9. echo ($w['zysk']);
  10. echo ('<br>');
  11. }
  12. ?>
nospor
czemu nie uzyjesz mysql_error() by zobaczyc konkretnie co masz źle? Juz tyle razy ci to mowiono...
mczlowiek
ok, już poprawione, tylko że wyświetla mi dane które posiadaja jakąś wartośc a czy istnieje możliwość , żeby zrobić tak ze jeśli jakaś dyscyplina nie była przypisana to żeby pokazywała wartość "0"

np:
pilka 4,5
siatka -5
kosz 0
basebal 0
...

chodzi o to, żeby wyświetlalo wszystki dyscypliny a nie tylko te które maja jakas wartosc.

nospor jestem ci krewny browarka winksmiley.jpg
nospor
skoro chcesz wyswietlac wszystkie dyscypliny to musisz zrobic na odwrot jak masz teraz, czyli musisz zrobic:
from dyscypliny left join zyski

wtedy dyscypliny sie beda wyswietlaly a zyski jak beda to sie dołączą, a jak nie bedzie to sie nie dołączą smile.gif

Cytat
nospor jestem ci krewny browarka
Poprostu uzywaj mysql_error(), analizuj skrypty, i włącz raportowanie wszystkich bledow. Jak to zrobisz to bedzie dla mnie wystarczajace podziekowanie smile.gif
JoShiMa
Cytat(mczlowiek @ 23.07.2008, 09:22:59 ) *
chodzi o to, żeby wyświetlalo wszystki dyscypliny a nie tylko te które maja jakas wartosc.


Albo tak:
  1. SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN zyski z ON d.id=z.dyscyplina GROUP BY d.id


Albo tak:
  1. SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z RIGHT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY d.id
mczlowiek
nie no nie rozumiem za bardzo, dlaczego nie wyświetla wszystkich dyscyplin?
  1. <?php 
  2. mysql_query("set names utf8");
  3. $sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina GROUP BY z.dyscyplina");
  4.  
  5.  
  6. while ($w = mysql_fetch_array($sql)) {
  7. echo ('<table width="480">
  8. <tr>
  9. <td width=250>'.$w['nazwa'].'</td>
  10. <td width=230>'.$w['zysk'].'</td>
  11. </tr>
  12. </table>');
  13. }
  14. ?>

w tabeli mam 19 dyscyplin z czego 3 maja jakąs wartopść, a wyświetla mi sie tylko 4, tak:

piłka nożna
kosz 4,5
siatka 5,5
baseball -5

czyli tylko jedna wartosc ktora nic nie ma w tym przypadku piłka nożna , a dlaczego nie wyświetlaja sie pozostałe "zerowe"?
nospor
nie GROUP BY z.dyscyplina
a: GROUP BY d.id

grupujac po dyscyplinie z zyskow traciles te dyscypliny, ktore nie mialy zysku
JoShiMa
Nie przeczytałeś uważnie. Postrzelony jesteś. Daleko tak nie zajedziesz.

Spróbuj
  1. GROUP BY d.id
mczlowiek
  1. <?php
  2. elseif($_GET['rok']){
  3. $d1 = mktime(0,0,0, date('1'), date('1'), date('Y'));
  4. $date1 = strftime("%Y-%m-%d", $d1);
  5. $d2 = mktime(0,0,0, date('12'), date('31'), date('Y'));
  6.  $date2 = strftime("%Y-%m-%d", $d2);
  7.  
  8. mysql_query("set names utf8");
  9. $sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina GROUP BY 'd.nazwa' WHERE `z.data` BETWEEN '" . $date1 . "' AND '" . $date2 . "'");
  10.  
  11.  
  12. while ($w = mysql_fetch_array($sql)) {
  13. ?>

sorki, że Wam tak truje, ale kombinuje na 100i 1 sposobów i nie wiem dlaczego tak się dzieje, że to nie działa, bła który mi się wyświetla to:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `z.data` BETWEEN '2008-01-01' AND '2008-12-31'' at line 1
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/tktbet/ftp/dzialy/statystyki.php on line 34
JoShiMa
Może dlatego, że GROUP BY powinno być na końcu... Używasz w ogóle jakiegoś manuala, czy tak piszesz na czuja?



Poza tym jaki już piszesz zapytanie w cudzysłowie " to korzystaj z jego dobrodziejstw:

  1. "SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina WHERE z.data BETWEEN '$date1 ' AND '$date2' GROUP BY d.nazwa"


i po co z.data i d.nazwa w apostrofach?
mczlowiek
tylko, że w momencie kiedy wpiszę tak jak powiedziałeś to znów nie wyświetla tych dyscyplin które mają "zerową" wartośc....
JoShiMa
Może trzeba napisac LEFT OUTER JOIN... Zadałeś sobie trud zdobycia wiedzy na temat tego jak działa JOIN i jakie są jego warianty? Weź się do roboty zamiast czekać na gotowe...
nospor
tu chodzi o ten warunek:
z.data BETWEEN '$date1 ' AND '$date2'
skoro pewne dyscypliny nie mają zaskow to i nie ma daty przy zyskach a co za tym idzie warunek nie jest spelniony. Tak proste ze az oczywiste winksmiley.jpg
trzeba dac jeszcze z.id is null:
z.id is null or (z.data BETWEEN '$date1 ' AND '$date2')
mczlowiek
Joshima z całym szacunkiem, ale na prawde szuałem i za karzym razem wyświetla sie tylko te rekordy które maja jakąś wartośc... OUTER - też tylko te które mają wartość
nospor
dzieci*, spokoj!. Tu tylko ja mam monopol na wywolywanie sporow winksmiley.jpg

Odpowiedź padła w moim poscie powyzej. A nastepnym razem staraj sie najpierw robic bez warunkow, a potem dopiero je dodawac. Bedziesz widzial gdzie jest potencjalny blad smile.gif

dzieci* określenie zartobliwe, prosze sie nie obrazac
JoShiMa
Cytat(nospor @ 23.07.2008, 10:33:28 ) *
A nastepnym razem staraj sie najpierw robic bez warunkow, a potem dopiero je dodawac. Bedziesz widzial gdzie jest potencjalny blad smile.gif

Słuszna uwaga. Ja tez się dałam nabrać smile.gif
mczlowiek
Panowie, teraz dostaje info, ze nie ma takiej kolumny :k.id, lecz jest w rzeczywistosci

  1. <?php
  2. if($_GET['id_liga']){
  3. mysql_query("set names utf8"); 
  4. $sql = " SELECT * FROM kluby k
  5. LEFT JOIN zawodnicy z ON z.id_klub=k.id WHERE k.id_liga='".$_GET['id_liga']."'  
  6. GROUP BY k.nazwa "; 
  7. $wynik = mysql_query($sql) or die(mysql_error());
  8. ?>


o co tu chodzi?
nospor
Cytat
Panowie
podpaździocha na calej linii.... JoShima jest przedstawicielką plci pięknej. W ramach przeprosin slij jej szybko kwiaty winksmiley.jpg

Skoro pisze ze nie ma, znaczy ze nie ma smile.gif
Pokaza strukture tabeli i dokladnie komunikat jaki dostajesz
mczlowiek
ok, już nieaktualne!!!

joshima wub.gif
biggrin.gif
dzieki za pomoc

------------
  1. <?php
  2.  
  3. if($_GET['id_liga']){
  4. mysql_query("set names utf8"); 
  5. $sql = " SELECT * FROM kluby k
  6. LEFT JOIN zawodnicy z ON z.id_klub=k.id_klub WHERE k.id_liga='".$_GET['id_liga']."'  
  7. GROUP BY k.klub "; 
  8. $wynik = mysql_query($sql) or die(mysql_error()); 
  9. $zm=""; 
  10. echo '<table width="480">'; 
  11. while($w = mysql_fetch_assoc($wynik)){ 
  12.  
  13.  
  14.  if($w['klub']!=$zm){ 
  15.  echo'<tr>
  16. <td colspan="4" background="../images/tlo_newsy_linia.gif"></td>
  17. </tr>';
  18. } 
  19.  
  20. echo'<tr>
  21.  <td width="250">';
  22.  
  23. if($w['klub']!=$zm){
  24.  echo ('<font face=verdana size =2 color=navy><b>'.$w['klub'].'</b></font>');
  25.  $zm=$w['klub']; 
  26.  }else{
  27.  echo '&nbsp';
  28.  }
  29.  
  30. echo '</td>
  31. <td width=230><img src="images/listarrow.jpg"> '.$w['nazw'].' '.$w['imie'].'
  32. </td>
  33. </tr>'; 
  34.  
  35. } 
  36. echo'</table>';
  37.  
  38. }
  39. ?>

i teraz jak mam 2 zawodnikow przypisanych do jednego klubu to wyswietla mi tylko jednego, dlaczego skoro uzylem while?

wyglada to tak
druzyna1
druzyna 2
druzyna 3 zawodnik1
druzyna 4
druzyna 5 zawodnik 2

a powinno wyglladac tak:
druzyna1
druzyna 2
druzyna 3 zawodnik1
..............zawodnik3
druzyna 4
druzyna 5 zawodnik 2
itd
nospor
bo uzywasz group by smile.gif
mczlowiek
zmieniłem na GROUP BY z.nazw
ale teraz wyswietla znow nie wszystkie kluby teraz jest tak:
klub1
klub2.....zawodnik1
............zawodnik2

i to koniec mimo iz dalej w kolejnym klubie sa przyporządkowani kolejni zawodnicy...
ręce opadają sad.gif

  1. <?php
  2. if($_GET['id_liga']){
  3. mysql_query("set names utf8"); 
  4. $sql = " SELECT * FROM kluby k
  5. LEFT OUTER JOIN zawodnicy z ON z.id_klub=k.id_klub WHERE k.id_liga='".$_GET['id_liga']."'  
  6. ORDER BY k.klub "; 
  7. $wynik = mysql_query($sql) or die(mysql_error());
  8. ?>

mam tylko czy to jest poprawnie (działać działa)
JoShiMa
  1. WHERE k.id_liga='".$_GET['id_liga']."'


Zdajesz sobie sprawę jakie to jest niebezpieczne?

W jakim celu robisz to grupowanie?
mczlowiek
dlaczego mówisz, że to jest niebezpieczne?
zapytanie polega to na tym , że ma kraje do których przypisane są ligi i jak kliknę w nazwę ligi to wtedy pobiera jej id i wyswietla wszystkie kluby które saw danej lidze
JoShiMa
Cytat(mczlowiek @ 24.07.2008, 12:46:52 ) *
dlaczego mówisz, że to jest niebezpieczne?

Dla tego, że to jest $_GET, czyli zmienna pochodzi z linku. Można więc w linku pod tą zmienną podstawić fragment zapytania SQL i zrobić poważne szkody w serwisie. Poczytaj sobie o SQL injection. Zmienne z $_GET a nawet z $_POST powinny być przed wstawieniem do stringu zapytania parsowane.
mczlowiek
nie zdawalem sobie sprawy, że to może być aż tak niebezpieczne.
Jak się przed tym zabezpieczyć, aby ktoś nie miał mozliwości ingerencji w moja bazę danych?
mike
Cytat(mczlowiek @ 24.07.2008, 13:09:16 ) *
Jak się przed tym zabezpieczyć, aby ktoś nie miał mozliwości ingerencji w moja bazę danych?
Temat rzeka. Zostało już na ten temat napisane wiele. Zacytuję:
Cytat(JoShiMa @ 24.07.2008, 12:49:45 ) *
Poczytaj sobie o SQL Injection.
pyro
jest tutorial na tym forum o sql injection
mczlowiek
no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?
mike
Cytat(mczlowiek @ 24.07.2008, 13:14:04 ) *
no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?
Mylisz się i to bardzo. Ponownie odsyłam do wyszukiwarki!
JoShiMa
Cytat(mczlowiek @ 24.07.2008, 13:14:04 ) *
no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?

Nie ważne. Pokasuje Ci całe tabele hi hi hi
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.