Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP+MySql 5.0]Optymalizacja kodu (zagnieżdżonych instrukcji While i odczytu z dwóch tabel)
Forum PHP.pl > Forum > PHP
djmati11
Pracuję nad pewnym skryptem i teraz piszę jego moduł - "Postęp prac".
Już mam działania matematyczne i bazę.
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.2.0.1
  3. --
  4. -- Host: localhost
  5. -- Czas wygenerowania: 11 Kwi 2010, 08:18
  6. -- Wersja serwera: 5.1.37
  7. -- Wersja PHP: 5.3.0
  8.  
  9. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  10.  
  11. --
  12. -- Baza danych: `allpage`
  13. --
  14.  
  15. -- --------------------------------------------------------
  16.  
  17. --
  18. -- Struktura tabeli dla `dozrobienia`
  19. --
  20.  
  21. CREATE TABLE IF NOT EXISTS `dozrobienia` (
  22. `id` int(11) NOT NULL AUTO_INCREMENT,
  23. `wersja` int(11) NOT NULL, -- id wersji
  24. `zadanie` varchar(5000) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  25. `postep` int(11) NOT NULL,
  26. `waga` int(11) NOT NULL,
  27. `odwolane` int(1) NOT NULL,
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=4 ;
  30.  
  31. --
  32. -- Zrzut danych tabeli `dozrobienia`
  33. --
  34.  
  35. INSERT INTO `dozrobienia` (`id`, `wersja`, `zadanie`, `postep`, `waga`, `odwolane`) VALUES
  36. (1, 1, 'Zrobić postęp prac', 90, 25, 0),
  37. (2, 1, 'System użytkowników', 2, 90, 0),
  38. (3, 1, 'Panel administracyjny', 0, 70, 0);
  39.  
  40. -- --------------------------------------------------------
  41.  
  42. --
  43. -- Struktura tabeli dla `wersje`
  44. --
  45.  
  46. CREATE TABLE IF NOT EXISTS `wersje` (
  47. `id` int(11) NOT NULL AUTO_INCREMENT,
  48. `wersja` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  49. `data` int(200) NOT NULL,
  50. PRIMARY KEY (`id`)
  51. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=2 ;
  52.  
  53. --
  54. -- Zrzut danych tabeli `wersje`
  55. --
  56.  
  57. INSERT INTO `wersje` (`id`, `wersja`, `data`) VALUES
  58. (1, '0.0.1', 1270917488);

W tym kodzie umieściłem komentarz o tym, że w tabeli dozrobienia pole wersja oznacza ID z tabeli wersje.

Kod PHP:
  1. <?php
  2. $result = mysql_query("SELECT * FROM wersje ORDER BY data DESC");
  3. while ($row = mysql_fetch_assoc($result)) {
  4. echo "<h3>".$row['wersja']." - ".date("d-m-Y")."<span id='lol'>20</span></h3>";
  5. $result = mysql_query("SELECT * FROM dozrobienia WHERE wersja=".$row['id']);
  6. $wagirazem = 0;
  7. $wynikrazem = 0;
  8. while ($row2 = mysql_fetch_assoc($result)) {
  9. if ($row2['odwolane']) {
  10. echo "<span class='przekreslony'>? ".$row2['zadanie']." - ".$row2['postep']."%</span>";
  11. } else {
  12. echo "? ".$row2['zadanie']." - ".$row2['postep'].'%';
  13. $wagirazem = $wagirazem + $row2['waga'];
  14. $prolol = $row2['postep'] * ($row2['waga'] / 100);
  15. $wynikrazem = $wynikrazem + $prolol;
  16.  
  17. }
  18. echo "<br>";
  19.  
  20. }
  21.  
  22. echo "<script type='text/javascript'>
  23. document.getElementById('lol').innerText = ' - ";
  24. echo round(($wynikrazem / $wagirazem) * 100);
  25. echo "%';
  26. </script>";
  27. }
  28. ?>


Chodzi mi o 2 rzeczy:

1.Jak zoptymalizować to:
  1. <?php
  2. $result = mysql_query("SELECT * FROM wersje ORDER BY data DESC");
  3. while ($row = mysql_fetch_assoc($result)) {
  4. echo "<h3>".$row['wersja']." - ".date("d-m-Y")."<span id='lol'>20</span></h3>";
  5. $result = mysql_query("SELECT * FROM dozrobienia WHERE wersja=".$row['id']);
  6. $wagirazem = 0;
  7. $wynikrazem = 0;
  8. while ($row2 = mysql_fetch_assoc($result)) {
  9. if ($row2['odwolane']) {
  10. echo "<span class='przekreslony'>? ".$row2['zadanie']." - ".$row2['postep']."%</span>";
  11. } else {
  12. echo "? ".$row2['zadanie']." - ".$row2['postep'].'%';
  13. $wagirazem = $wagirazem + $row2['waga'];
  14. $prolol = $row2['postep'] * ($row2['waga'] / 100);
  15. $wynikrazem = $wynikrazem + $prolol;
  16.  
  17. }
  18. echo "<br>";
  19.  
  20. }

Chodzi o zamienienie tak kodu, aby była w nim tylko jedna instrukcja While, a nie dwie.

2.Czym zastąpić to:
  1. echo "<script type='text/javascript'>
  2. document.getElementById('lol').innerText = ' - ";
  3. echo round(($wynikrazem / $wagirazem) * 100);
  4. echo "%';
  5. </script>";

Skrypt zmienia zawartość tego spana:
  1. <span id='lol'></span>

na procent postępu:
  1. echo round(($wynikrazem / $wagirazem) * 100);


3. Jak znajdziecie inne błędy to piszcie.
outsider
1.
jedno zapytanie SQl = jedna petla while, nie wiem czy dobra, ale cos w tym rodzaju smile.gif
  1. $result = mysql_query("SELECT * FROM wersje INNER JOIN dozrobienia ON dozrobienia.wersja=wersje.id ORDER BY wersje.data DESC");
djmati11
*OuTSideR*, dzięki za pomoc, ale ostateczne zapytanie wygląda tak:
  1. mysql_query("SELECT * FROM wersje, dozrobienia WHERE dozrobienia.wersja=wersje.id_w ORDER BY wersje.data DESC");


Zmieniłem także kod JS (do pkt. 2):
  1. $id = 1;
  2. foreach ($tb as $lol) {
  3. echo "<script type='text/javascript'>
  4. document.getElementById('lol".$id."').innerText = ' - ";
  5. echo $tb[$id];
  6. echo "%';";
  7. echo "document.getElementById('w".$id."').innerHTML = '";
  8. echo '<div style="height: 9px; width: '.$tb[$id].'%; background-color: darkblue;"></div>';
  9. echo "';";
  10. echo "</script>";
  11. $id++;
  12. }
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.