Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Branie do średniej oceny poprawionej jeżeli jest
kuba_pilach
post 12.03.2011, 20:55:03
Post #1





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


Witam, mam pobieram średnią ocen z danego przedmiotu i zaokrąglam ją:
  1. $wynik = mysql_query("SELECT NAZWA, GROUP_CONCAT(Oceny.OCENA) AS lista_ocen, AVG(Oceny.OCENA) AS srednia FROM Oceny AS Oceny LEFT JOIN Przedmiot AS Przedmiot ON Oceny.ID_PRZEDMIOTU = Przedmiot.ID WHERE Oceny.ID_USERA = '$z[ID]' GROUP BY Oceny.ID_PRZEDMIOTU")
  2. or die(mysql_error());
  3.  
  4. /*
  5. wywietlamy wyniki, sprawdzamy,
  6. czy zapytanie zwróciło wartoć większą od 0
  7. */
  8. ?>
  9. <ul>
  10. <div id="form_container">
  11. <div>
  12. <?php
  13. if(mysql_num_rows($wynik) > 0) {
  14. /* jeżeli wynik jest pozytywny, to wywietlamy dane */
  15. echo "<br />";
  16. echo "<table cellpadding=\"2\" border=1>";
  17. echo "<tr>";
  18. echo "<td>Przedmiot</td>";
  19. echo "<td>Oceny</td>";
  20. echo "<td>Srednia</td>";
  21. echo "</tr>";
  22. while($r = mysql_fetch_assoc($wynik)) {
  23. echo "<tr>";
  24. echo "<td>".$r['NAZWA']."</td>";
  25. echo "<td>".$r['lista_ocen']."</td>";
  26. $r['srednia'] = round($r['srednia'], 2);
  27. echo "<td>".$r['srednia']."</td>";

I to już mam prawidłowo... Ale dodałem możliwość wpisywania z / znacznikiem poprawienia, więc pytanie moje jest takie:
Jak sprawdzić, czy w każdej pojedynczej jest druga ocena podana oddzielona znakiem /, a jeżeli jest, to brać tą drugą do liczenia średniej... Jest takie coś możliwe? Dzięki z góry!
Go to the top of the page
+Quote Post
Daiquiri
post 12.03.2011, 21:40:56
Post #2





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Jeżeli dobrze rozumiem to strpos i explode.
Go to the top of the page
+Quote Post
kuba_pilach
post 12.03.2011, 22:10:57
Post #3





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


A może by ktoś coś więcej napisał...? Bo przeczytałem o tych rzeczach,ale nadal nie wiem, jak je połączyć
z moim kodem... Bardzo proszę i dzięki z góry...
Go to the top of the page
+Quote Post
Daiquiri
post 13.03.2011, 11:16:38
Post #4





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Zakładam, że masz zmienną $ocena = "4/5". Jeżeli chcesz sprawdzić czy w zmiennej występuje "/" korzystasz z strpos():
  1. $szukaj = '/';
  2. $pos = strpos($ocena, $szukaj);
  3.  
  4. if ($pos === false) {
  5. echo "Nie ma łamania w zmiennej";
  6. } else {
  7. echo "Jest łamanie w zmiennej";
  8. }
Skoro wiesz, że masz łamanie (/) w zmiennej, korzystasz z explode():
  1. $tab_ocena = explode('/', $ocena);
  2. // $tab_ocena[0] będzie miało wartośc 4
  3. // $tab_ocena[1] będzie miało wartość 5
  4. $ocena = $tab_ocena[1] // bo Ciebie interesuje ta druga wartość
Możesz też skorzystać z substr i po prostu "obciąć" początkową ocenę oraz /.
Go to the top of the page
+Quote Post
kuba_pilach
post 13.03.2011, 14:24:25
Post #5





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


Witam, ale największy problem jest w tym, że za pomocą zapytania tworzę alias lista_ocen... Który bierze każdą ocenę z przedmiotu i wypisuje jak na kartce z ocenami... Weś daj jakby to wyglądało w moim kodzie... Dzięki z góry

Odświeżam i nadal potrzebuję pomocy!
Go to the top of the page
+Quote Post
Daiquiri
post 13.03.2011, 14:35:36
Post #6





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




No to wstaw wszystko w while, a zamiast zmiennej $ocena wykorzystaj swoją zmienną np. $r['lista_ocen'] (jeżeli tam trzymasz ocenę).
Go to the top of the page
+Quote Post
kuba_pilach
post 13.03.2011, 14:59:59
Post #7





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


Sorki za moje niezrozumienie, ale lista_ocen przechowuje wszystkie oceny po przecinku z danego przedmiotu...
Go to the top of the page
+Quote Post
Daiquiri
post 13.03.2011, 15:38:16
Post #8





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




No to rozbij ją na poszczególne oceny korzystając z $tab_ocen = explode(",", $r['lista_ocen']);, dzięki temu wszystkie oceny będą dostępne pojedynczo w tablicy $tab_ocen ($tab_ocen[0], $tab_ocen[1] itd.). Każdą z pozycji możesz wtedy potraktować kodem powyżej, czyli np.
  1. $tab_ocen = explode(",", $r['lista_ocen'] );
  2. $ile = count($tab_ocen);
  3. for ($i=0; $i<$ile; ++$i) { // przechodzisz przez każdą pozycję z tablicy ocen:
  4. // tutaj wstaw kod z strpos, czyli sprawdzanie czy ocena jest "łamana"
  5. // w przypadku gdy znajdziemy znak łamania wykorzystaj explode() lub substr()
  6. }
Go to the top of the page
+Quote Post
kuba_pilach
post 13.03.2011, 15:41:26
Post #9





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


A potem jak wykorzystać to do średniej?
Bo właśnie taki jest mój końcowy cel ;]
Go to the top of the page
+Quote Post
kefirek
post 13.03.2011, 16:15:59
Post #10





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


  1. while($r = mysql_fetch_assoc($wynik)) {
  2. $tab_ocen = explode(",", $r['lista_ocen']);
  3.  
  4. $ile = count($tab_ocen);
  5.  
  6. $avg = 0;
  7.  
  8. for ($i=0; $i<$ile; ++$i) {
  9. $ocena = array();
  10. if(strpos($tab_ocen[$i], '/')){
  11.  
  12. $ocena = explode("/", $tab_ocen[$i]);
  13. $avg += $ocena[1];
  14.  
  15. } else {
  16.  
  17. $avg += $tab_ocen[$i];
  18.  
  19. }
  20.  
  21. }
  22.  
  23. echo round($avg / $ile , 2);
  24.  
  25. }


Ten post edytował kefirek 13.03.2011, 16:20:11
Go to the top of the page
+Quote Post
kuba_pilach
post 13.03.2011, 16:31:42
Post #11





Grupa: Zarejestrowani
Postów: 224
Pomógł: 3
Dołączył: 24.12.2010

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


Ok, dzięki wam! Działa wszystko dobrze... Dałem że pomogliście ;]
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: 19.07.2025 - 10:05