Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z optymalizacją - słaba wydajność kodu
Forum PHP.pl > Forum > Gotowe rozwiązania > Skrypty obsługi baz danych
primo83
Fragment kodu ma za zadanie wypełnić kalendarz rezerwacji samochodów (każde wypełnienie jest równocześnie aktywnym linkiem prowadzącym do szczegółów konkretnej rezerwacji). Teoretycznie wszystko działa, ale wydajność jest fatalna - załadowanie strony trwa od 7 do 11 sekund. Dopiero się uczę PHP i MySql dlatego nie bardzo wiem co mogę zrobić. Z góry dziękuję




  1. $zapytanie5 = "SELECT car_id, car_nazwa, car_cena1, car_cena2, car_cena3, car_cena4, car_cena5 FROM samochody ORDER BY car_nazwa ASC";
  2. $wynik5 = mysql_query($zapytanie5);
  3. $liczba_pol5 = mysql_num_fields($wynik5);
  4. while($pole = mysql_fetch_array($wynik5)) //ok 15 powtórzeń
  5. {
  6. for ($i=0;$i<$liczba_pol5;$i=$i+7)
  7. {
  8. $car_id = $pole[$i];
  9. $car_nazwa = $pole[$i+1];
  10. $cena1=$pole[$i+2];
  11. $cena2=$pole[$i+3];
  12. $cena3=$pole[$i+4];
  13. $cena4=$pole[$i+5];
  14. $cena5=$pole[$i+6];
  15.  
  16. if ($cena1 == 0 OR $cena2 == 0 OR $cena3 == 0 OR $cena4 == 0 OR $cena5 == 0){
  17. $czy_publikowac='nie';
  18. }
  19. else{
  20. $czy_publikowac='tak';
  21. }
  22.  
  23. $zapyt = "select kolor from samochody_kolory where car_id='$car_id'";
  24. $wyn = mysql_query($zapyt);
  25. $liczba_pol = mysql_num_fields($wyn);
  26. while($pole_k = mysql_fetch_array($wyn))
  27. {
  28. for ($i=0;$i<$liczba_pol;$i=$i+1)
  29. {
  30. $kolor = $pole_k[$i];
  31. }
  32. }
  33.  
  34. if ($czy_publikowac=='tak'){
  35. echo'<td align="left" width="257" height="30" bgcolor="'.$kolor.'"><font face="Arial"><b>'.$car_nazwa.'</b></font></td>';
  36. }
  37.  
  38. for ($licznik_dzien=1;$licznik_dzien<32;$licznik_dzien=$licznik_dzien+1)
  39. {
  40. if(checkdate($miesiac, $licznik_dzien, $rok))
  41. {
  42. $kontrola=0;
  43.  
  44. //------------------
  45. $zapyt001 = "SELECT * FROM tabela_rezerwacji WHERE rez_id_samochod='$car_id' AND rez_data_rok='$rok' AND rez_data_mies='$miesiac' AND rez_data_dzien='$licznik_dzien'";
  46. $wynik001 = mysql_query($zapyt001);
  47.  
  48. $liczba_pol = mysql_num_fields($wynik001);
  49. $liczba_wierszy = mysql_num_rows($wynik001);
  50. while($pole = mysql_fetch_array($wynik001))
  51. {
  52. $kontrola=1;
  53. }
  54. //------------------
  55.  
  56. $zapyt001 = "SELECT * FROM tabela_rezerwacji WHERE rez_id_samochod='$car_id' AND rez_data_rok='$rok' AND rez_data_mies='$miesiac' AND rez_data_dzien='$licznik_dzien' ORDER BY rez_godzina ASC";
  57. $wynik001 = mysql_query($zapyt001);
  58.  
  59. $liczba_pol = mysql_num_fields($wynik001);
  60. $liczba_wierszy = mysql_num_rows($wynik001);
  61. if ($kontrola==1 AND $czy_publikowac=='tak'){
  62. echo '<td align="center" width="27" height="30" bgcolor="'.$kolor.'"><font face="Arial">';
  63. }
  64. if ($kontrola != 1 AND $czy_publikowac=='tak'){
  65. echo '<td align="center" width="27" height="30"><font face="Arial">&nbsp;';
  66. }
  67. while($pole = mysql_fetch_array($wynik001))
  68. {
  69. $rez_id_samochod = $pole[0];
  70. $rez_data_dzien = $pole[1];
  71. $rez_data_mies = $pole[2];
  72. $rez_data_rok = $pole[3];
  73.  
  74. $rez_godzina = $pole[4];
  75. $rez_minuta = $pole[5];
  76. $rez_zw_godzina = $pole[6];
  77. $rez_zw_minuta = $pole[7];
  78.  
  79. $rez_nazwisko = $pole[8];
  80. $rez_telefon = $pole[9];
  81. $rez_miejsce_wyn = $pole[10];
  82. $rez_miejsce_zwr = $pole[11];
  83. $rez_uwagi = $pole[12];
  84. $rez_numer = $pole[13];
  85. $kontrola=1;
  86.  
  87. if ($rez_godzina==0){
  88. $rez_godzina='00';
  89. }
  90. if ($rez_minuta==0){
  91. $rez_minuta='00';
  92. }
  93. if ($rez_zw_godzina==0){
  94. $rez_zw_godzina='00';
  95. }
  96. if ($rez_zw_minuta==0){
  97. $rez_zw_minuta='00';
  98. }
  99.  
  100. if ($czy_publikowac=='tak'){
  101.  
  102. if ($rez_godzina==-77 and $rez_zw_godzina==77){
  103. echo '<a title="'.$rez_numer.'" href="kalendarz3.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2">X</font></b></a><br>';
  104. }
  105. if ($rez_godzina!=-77){
  106. echo '<a title="'.$rez_numer.'" href="kalendarz3.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2" color="#004000">'.$rez_godzina.':'.$rez_minuta.'</font></b></a><br>';
  107. }
  108. if ($rez_zw_godzina!=77){
  109. echo '<a title="'.$rez_numer.'" href="kalendarz3.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2" color="#B00000">'.$rez_zw_godzina.':'.$rez_zw_minuta.'</font></b></a><br>';
  110. }
  111.  
  112. }
  113. }
  114. echo '</font></td>';
  115. }
  116. }
  117. echo '</tr>';
  118. }
  119. }
  120.  
Pyton_000
Nudziło mi się wink.gif Nie wiem czy działa, pewnie jakies błędy wywali ale masz ogólny zarys co możesz poprawiać.
Ogólnie dużo zapytań wykonujesz. Poprzeglądaj i przeanalizuj.

  1. $zapytanie5 = "
  2. SELECT
  3. car_id, car_nazwa, car_cena1, car_cena2, car_cena3, car_cena4, car_cena5, kolor
  4. FROM
  5. samochody s
  6. LEFT JOIN samochody_kolory sk ON(sk.car_id = s.id)
  7. ORDER BY car_nazwa ASC";
  8. $wynik5 = mysql_query($zapytanie5);
  9. $liczba_pol5 = mysql_num_fields($wynik5);
  10.  
  11. while ($pole = mysql_fetch_array($wynik5)) //ok 15 powtórzeń
  12. {
  13. $car_id = $pole[0];
  14. $car_nazwa = $pole[1];
  15. $cena1 = $pole[2];
  16. $cena2 = $pole[3];
  17. $cena3 = $pole[4];
  18. $cena4 = $pole[5];
  19. $cena5 = $pole[6];
  20. $kolor = $pole[7];
  21.  
  22. $czy_publikowac = ($cena1 && $cena2 && $cena3 && $cena4 && $cena5) ? 'tak' : 'nie';
  23.  
  24.  
  25. if ($czy_publikowac == 'tak')
  26. {
  27. echo '<td align="left" width="257" height="30" bgcolor="' . $kolor . '"><font face="Arial"><b>' . $car_nazwa . '</b></font></td>';
  28. }
  29.  
  30. $zapyt001 = "
  31. SELECT *
  32. FROM tabela_rezerwacji
  33. WHERE
  34. rez_id_samochod='$car_id' AND
  35. rez_data_rok='$rok' AND
  36. rez_data_mies='$miesiac'
  37. -- AND rez_data_dzien='$licznik_dzien'
  38. ORDER BY rez_data_dzien ASC rez_godzina ASC";
  39. $wynik001 = mysql_query($zapyt001);
  40.  
  41. $rezerwacje = array();
  42. while($rezerwacja = mysql_fetch_array($wynik001))
  43. {
  44. $rezerwacje[$rezerwacja['rez_data_dzien']] = $rezerwacja;
  45. }
  46.  
  47. for ($licznik_dzien = 1; $licznik_dzien < 32; $licznik_dzien = $licznik_dzien + 1)
  48. {
  49. if (checkdate($miesiac, $licznik_dzien, $rok))
  50. {
  51. if($czy_publikowac == 'tak' && !array_key_exists($licznik_dzien, $rezerwacje))
  52. {
  53. echo '<td align="center" width="27" height="30"><font face="Arial">&nbsp;</font></td>';
  54. continue;
  55. }
  56. elseif ($czy_publikowac == 'tak')
  57. {
  58. echo '<td align="center" width="27" height="30" bgcolor="' . $kolor . '"><font face="Arial">';
  59. }
  60.  
  61. foreach($rezerwacje[$licznik_dzien] as $pole)
  62. {
  63. $rez_id_samochod = $pole[0];
  64. $rez_data_dzien = $pole[1];
  65. $rez_data_mies = $pole[2];
  66. $rez_data_rok = $pole[3];
  67.  
  68. $rez_godzina = $pole[4];
  69. $rez_minuta = $pole[5];
  70. $rez_zw_godzina = $pole[6];
  71. $rez_zw_minuta = $pole[7];
  72.  
  73. $rez_nazwisko = $pole[8];
  74. $rez_telefon = $pole[9];
  75. $rez_miejsce_wyn = $pole[10];
  76. $rez_miejsce_zwr = $pole[11];
  77. $rez_uwagi = $pole[12];
  78. $rez_numer = $pole[13];
  79. $kontrola = 1;
  80.  
  81. if ($rez_godzina == 0)
  82. {
  83. $rez_godzina = '00';
  84. }
  85. if ($rez_minuta == 0)
  86. {
  87. $rez_minuta = '00';
  88. }
  89. if ($rez_zw_godzina == 0)
  90. {
  91. $rez_zw_godzina = '00';
  92. }
  93. if ($rez_zw_minuta == 0)
  94. {
  95. $rez_zw_minuta = '00';
  96. }
  97.  
  98. if ($czy_publikowac == 'tak')
  99. {
  100.  
  101. if ($rez_godzina == -77 and $rez_zw_godzina == 77)
  102. {
  103. echo '<a title="' . $rez_numer . '" href="kalendarz3.php?zmiana=tak&zm_rok=' . $rok . '&zm_miesiac=' . $miesiac . '&rez=tak&rez_nr=' . $rez_numer . '"><b><font size="2">X</font></b></a><br>';
  104. }
  105. if ($rez_godzina != -77)
  106. {
  107. echo '<a title="' . $rez_numer . '" href="kalendarz3.php?zmiana=tak&zm_rok=' . $rok . '&zm_miesiac=' . $miesiac . '&rez=tak&rez_nr=' . $rez_numer . '"><b><font size="2" color="#004000">' . $rez_godzina . ':' . $rez_minuta . '</font></b></a><br>';
  108. }
  109. if ($rez_zw_godzina != 77)
  110. {
  111. echo '<a title="' . $rez_numer . '" href="kalendarz3.php?zmiana=tak&zm_rok=' . $rok . '&zm_miesiac=' . $miesiac . '&rez=tak&rez_nr=' . $rez_numer . '"><b><font size="2" color="#B00000">' . $rez_zw_godzina . ':' . $rez_zw_minuta . '</font></b></a><br>';
  112. }
  113.  
  114. }
  115. }
  116.  
  117. echo '</font></td>';
  118. }
  119. }
  120. echo '</tr>';
  121. }
primo83
Bardzo dziękuję za pomoc.
Wyciągnąłem zapytania do bazy danych na zewnątrz pętli, a wszystkie operacje wykonałem na tablicach.
Prędkość przetwarzania po stronie serwera wzrosła (aż ciężko uwierzyć smile.gif) z 7-11 sekund do 0.025-0,035 sekundy!

Wklejam działający kod i pozdrawiam:

  1. $zapyt001 = "SELECT * FROM tabela_rezerwacji WHERE rez_data_rok='$rok' AND rez_data_mies='$miesiac' ORDER BY rez_godzina ASC";
  2. $wynik001 = mysql_query($zapyt001);
  3. $dane = Array();
  4. $z = 0;
  5. $h = 0;
  6. while ($r = mysql_fetch_array($wynik001)){
  7.  
  8. $dane[] = $r;
  9.  
  10. $z = $z + 1;
  11.  
  12. }
  13.  
  14. $zapytanie5 = "SELECT samochody.car_id, samochody.car_nazwa, samochody.car_cena1, samochody.car_cena2, samochody.car_cena3, samochody.car_cena4, samochody.car_cena5, samochody_kolory.kolor FROM samochody JOIN samochody_kolory ON samochody.car_id = samochody_kolory.car_id ORDER BY car_nazwa ASC";
  15.  
  16. $wynik5 = mysql_query($zapytanie5);
  17. $liczba_pol5 = mysql_num_fields($wynik5);
  18. while($pole = mysql_fetch_array($wynik5))
  19. {
  20. for ($i=0;$i<$liczba_pol5;$i=$i+8)
  21. {
  22. $car_id = $pole[$i];
  23. $car_nazwa = $pole[$i+1];
  24. $cena1=$pole[$i+2];
  25. $cena2=$pole[$i+3];
  26. $cena3=$pole[$i+4];
  27. $cena4=$pole[$i+5];
  28. $cena5=$pole[$i+6];
  29. $kolor=$pole[$i+7];
  30.  
  31. if ($cena1 == 0 OR $cena2 == 0 OR $cena3 == 0 OR $cena4 == 0 OR $cena5 == 0){
  32. $czy_publikowac='nie';
  33. }
  34. else{
  35. $czy_publikowac='tak';
  36. }
  37.  
  38.  
  39.  
  40. if ($czy_publikowac=='tak'){
  41. echo'<td align="left" width="257" height="35" bgcolor="'.$kolor.'"><font face="Arial"><b>'.$car_nazwa.'</b></font></td>';
  42. }
  43.  
  44. for ($licznik_dzien=1;$licznik_dzien<32;$licznik_dzien=$licznik_dzien+1)
  45. {
  46. if(checkdate($miesiac, $licznik_dzien, $rok))
  47. {
  48.  
  49. $kontrola=0;
  50.  
  51. for($i = 0; $i<$z; $i++) {
  52. if($dane[$i]['rez_id_samochod'] == $car_id && $dane[$i]['rez_data_dzien'] == $licznik_dzien){
  53. $kontrola = 1;
  54. $h = $i;
  55. break;
  56. }
  57. }
  58.  
  59. if ($kontrola==1 AND $czy_publikowac=='tak'){
  60. if($licznik_dzien==$dzien){
  61. echo '<td align="center" width="27" height="35" bgcolor="'.$kolor.'" style="border-left: 3px solid #000000; border-right: 3px solid #000000"><font face="Arial">';
  62. }
  63. else {
  64. echo '<td align="center" width="27" height="35" bgcolor="'.$kolor.'"><font face="Arial">';
  65. }
  66. }
  67. if ($kontrola != 1 AND $czy_publikowac=='tak'){
  68. if($licznik_dzien==$dzien){
  69. echo '<td align="center" width="27" height="35" style="border-left: 3px solid #000000; border-right: 3px solid #000000"><font face="Arial">&nbsp;';
  70. }
  71. else {
  72. echo '<td align="center" width="27" height="35"><font face="Arial">&nbsp;';
  73. }
  74. }
  75.  
  76. for($h = $h; $h<$z; $h++) {
  77. if($dane[$h]['rez_id_samochod'] == $car_id && $dane[$h]['rez_data_dzien'] == $licznik_dzien){
  78. $rez_id_samochod = $dane[$h]['rez_id_samochod'];
  79. $rez_data_dzien = $dane[$h]['rez_data_dzien'];
  80. $rez_data_mies = $dane[$h]['rez_data_mies'];
  81. $rez_data_rok = $dane[$h]['rez_data_rok'];
  82.  
  83. $rez_godzina = $dane[$h]['rez_godzina'];
  84. $rez_minuta = $dane[$h]['rez_minuta'];
  85. $rez_zw_godzina = $dane[$h]['rez_zw_godzina'];
  86. $rez_zw_minuta = $dane[$h]['rez_zw_minuta'];
  87.  
  88. $rez_nazwisko = $dane[$h]['rez_nazwisko'];
  89. $rez_telefon = $dane[$h]['rez_telefon'];
  90. $rez_miejsce_wyn = $dane[$h]['rez_miejsce_wyn'];
  91. $rez_miejsce_zwr = $dane[$h]['rez_miejsce_zwr'];
  92. $rez_uwagi = $dane[$h]['rez_uwagi'];
  93. $rez_numer = $dane[$h]['rez_numer'];
  94.  
  95.  
  96. if ($rez_godzina==0){
  97. $rez_godzina='00';
  98. }
  99. if ($rez_minuta==0){
  100. $rez_minuta='00';
  101. }
  102. if ($rez_zw_godzina==0){
  103. $rez_zw_godzina='00';
  104. }
  105. if ($rez_zw_minuta==0){
  106. $rez_zw_minuta='00';
  107. }
  108.  
  109. if ($czy_publikowac=='tak'){
  110.  
  111. if ($rez_godzina==-77 and $rez_zw_godzina==77){
  112. echo '<a title="'.$rez_numer.'" href="kalendarz.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2">X</font></b></a><br>';
  113. }
  114. if ($rez_godzina!=-77){
  115. echo '<a title="'.$rez_numer.'" href="kalendarz.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2" color="#004000">'.$rez_godzina.':'.$rez_minuta.'</font></b></a><br>';
  116. }
  117. if ($rez_zw_godzina!=77){
  118. echo '<a title="'.$rez_numer.'" href="kalendarz.php?zmiana=tak&zm_rok='.$rok.'&zm_miesiac='.$miesiac.'&rez=tak&rez_nr='.$rez_numer.'"><b><font size="2" color="#B00000">'.$rez_zw_godzina.':'.$rez_zw_minuta.'</font></b></a><br>';
  119. }
  120.  
  121. }
  122.  
  123. }
  124. }
  125. echo '</font></td>';
  126. }
  127. }
  128. echo '</tr>';
  129. }
  130.  
  131. }
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-2024 Invision Power Services, Inc.