Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL]Dzienniczek ucznia, czy nie dało by się lepiej?
cycofiasz
post
Post #1





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


Witam, zrobiłem sobie skrypt dzienniczka ucznia. Zasady działania nie muszę za pewne tłumaczyć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Mam 2 tabele w mysql:
(IMG:http://i43.tinypic.com/2rh4591.png)

(IMG:http://i44.tinypic.com/1g11tg.png)

Skliciłem taki oto skrypt:
  1. <?php
  2. echo '<table style="border-collapse: collapse;" border="1">'."\n";
  3. echo ' <caption style="caption-side: top;padding: 2px;"><b>Oceny ucznia nr. 20</b></caption>'."\n";
  4. echo ' <tr align="center"><td width="30"><strong>Lp.</strong></td><td width="200"><strong>PRZEDMIOT</strong></td><td width="200"><strong>OCENY</strong></td>'."\n";
  5.  
  6. // pobieramy listę przedmiotów
  7. $sql_przdmioty = mysql_query ("SELECT `przedm_id`,    `przedm_nazwa` FROM `dzienniczek_przedmioty`");
  8.  
  9. while ($row = mysql_fetch_array($sql_przdmioty))
  10. {    
  11.    $oceny=''; $o=''; //resetowanie zmiennych
  12.    $sql_oceny = mysql_query ("SELECT `ocena_stopien` ,`ocena_waznosc` FROM `dzienniczek_oceny` WHERE `ocena_przedm_id` = '$row[przedm_id]'");
  13.    while ($row2 = mysql_fetch_array($sql_oceny))
  14.    {
  15.        if($row2[ocena_waznosc] == '1') $o = '<span style="color:red">'.$row2[ocena_stopien].'</span>'; // kolorowanie sprawdzienów
  16.        elseif($row2[ocena_waznosc] == '2') $o = '<span style="color:blue">'.$row2[ocena_stopien].'</span>'; //kolorowanie innych ocen
  17.        $oceny .= $o.', ';
  18.    }
  19.    
  20.    echo " <tr><td>$row[przedm_id]</td><td>$row[przedm_nazwa]</td><td>$oceny</td></tr>\n";
  21. }
  22.  
  23. echo '</table>'."\n";
  24. ?>


co dało taki rezultat (taki jak ma być)

(IMG:http://i42.tinypic.com/kevzew.png)


Jak zauważyliście skrypt ten pobiera najpierw listę przedmiotów i podczas każdego przebiegu pętli jest wykonywane zapytanie o oceny do tego przedmiotu... Nie wydaje się wam się też że to jest nieoptymalne? Jak pobrać to wszystko bez zawierania w pętlach zapytań do sql?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
cycofiasz
post
Post #2





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


Ten 2 sposób wydaje się chyba sensowniejszy.

Czyli najpierw wykonuję zapytanie sql_oceny
  1. SELECT ocena_przedm_id , ocena_stopien , ocena_waznosc FROM `dzienniczek_oceny`


Przekazuję wynik do tablicy $oceny
  1. <?php
  2. while ($row = mysql_fetch_array($sql_oceny)) $oceny[]=$row
  3. ?>


Otrzymam taką zawartość tablicy $oceny:
  1. <?php
  2. (
  3.    [0] => Array
  4.        (
  5.            [0] => 2
  6.            [ocena_przedm_id] => 2
  7.            [1] => 5
  8.            [ocena_stopien] => 5
  9.            [2] => 2
  10.            [ocena_waznosc] => 2
  11.        )
  12.  
  13.    [1] => Array
  14.        (
  15.            [0] => 3
  16.            [ocena_przedm_id] => 3
  17.            [1] => 5
  18.            [ocena_stopien] => 5
  19.            [2] => 1
  20.            [ocena_waznosc] => 1
  21.        )
  22.     ...dalsze wartości...
  23. )
  24. ?>


A potem pobieram listę przedmiotów z bazy i przy każdym przebiegu pętli, zamiast dawać kolejne zapytanie do mysql, filtruję tablicę $oceny za pomocą pętli foreach:
  1. <?php
  2. //pobieramy wszystkie oceny
  3. $sql_oceny = mysql_query ("SELECT ocena_przedm_id , ocena_stopien , ocena_waznosc FROM `dzienniczek_oceny`");
  4.  
  5. while($row1 = mysql_fetch_array($sql_oceny))
  6. $oceny[] = $row1;
  7.  
  8.  
  9. // pobieramy listę przedmiotów
  10. $sql_przdmioty = mysql_query ("SELECT `przedm_id`,    `przedm_nazwa` FROM `dzienniczek_przedmioty`");
  11.  
  12. while ($row2 = mysql_fetch_array($sql_przdmioty))
  13. {    
  14.    $ocenki = '';
  15.    foreach($oceny as $wartosc)
  16.    {
  17.        if($wartosc[ocena_przedm_id] == $row2[przedm_id])
  18.        {
  19.            $ocenki .= $wartosc[ocena_stopien].', ';
  20.        }
  21.    }
  22.    
  23.    echo " <tr><td>$row2[przedm_id]</td><td>$row2[przedm_nazwa]</td><td>$ocenki</td></tr>\n";
  24. }
  25.  
  26. echo '</table>'."\n";
  27. ?>

Dobrze zrozumiałem? Czy to jest wydajniejsze niż dawanie zapytań przy każdym przedmiocie? Ta tablica $oceny z czasem może stać się większa...

Ten post edytował cycofiasz 17.01.2009, 11:03:21
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 19:21