За последние 24 часа нас посетили 21648 программистов и 1020 роботов. Сейчас ищут 649 программистов ...

Расписание на PHP, SQL

Тема в разделе "PHP для новичков", создана пользователем Alex.G, 28 июн 2018.

  1. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Добрый вечер!

    В БД есть запись на услугу с 9:00 до 10:00

    Сделал расписание, с таким условием чтобы было видно запись на 9:00 и при этом в период с 9:00 до 10:00 таких строк как 9:10, 9:20, 9:30, 9:40, 9:50 не было видно. В остальное время выводится "Свободно".
    Написал код:
    PHP:
    1. for ($i=0; $i < 24; $i++) {
    2.                                     for ($j=0; $j < 6; $j++) {
    3.                                         $t = $i / 2;
    4.                                         if ($t < 5) {
    5.                                             $h = '0';
    6.                                         }
    7.                                         else {
    8.                                             $h = '';
    9.                                         }
    10.                                         $time = $h.$i.':'.$j.'0:00';
    11.                                         $time3 = $h.$i.':'.$j.'0';
    12.                                         $sel1 = mysql_query("SELECT * FROM gen_services WHERE time_st_serv='$time' and date_serv='$date' and num_box='1'");
    13.                                         $sel2 = mysql_query("SELECT * FROM gen_services WHERE time_st_serv<'$time' and date_serv='$date' and time_end_serv>'$time' and num_box='1'");
    14.                                         $row1 = mysql_num_rows($sel1);
    15.                                         $row2 = mysql_num_rows($sel2);
    16.                                         $tim1 = mysql_fetch_assoc($sel1, MYSQL_ASSOC);
    17.                                         $name_cl = $tim1['name_cl'];
    18.                                         if ($row1) {
    19.                                             $db = 'display: block;';
    20.                                             $text = $name_cl;
    21.                                             $time_st1 = mb_substr($tim1['time_st_serv'],0,5,'UTF-8'); // 1 запрос
    22.                                             $time_end1 = mb_substr($tim1['time_end_serv'],0,5,'UTF-8');
    23.                                             $time_g = mb_substr($time_st1,0,5,'UTF-8').'-'.mb_substr($time_end1,0,5,'UTF-8');
    24.                                         }
    25.                                         if ($row2) {
    26.                                             $db = 'display: none;';
    27.                                         }
    28.                                         if (!$row1 && !$row2) {
    29.                                             $text = 'Свободно';
    30.                                             $db = 'display: block;';
    31.                                             $time_g = $time3;
    32.                                         }
    33.                                         echo '<div style="'.$db.'" class="block-serv"><p style="margin: 0;">'.$time_g.'&nbsp;&nbsp;&nbsp;'.$text.'</p></div>';
    34.                                     }
    35.                                 }
    Безымянный22.png
    Код работает отлично, но есть одно НО - очень долго грузится страница
    Прошу помощи, может как то можно все это упростить
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    почему?
     
  3. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Я так понимаю из-за большого количества запросов к БД
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а ты выясни
    растыкай везде вывод времени и замеряй, сколько миллисекунд на что идёт
     
  5. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Сделал так
    PHP:
    1. $sel1 = mysql_query("SELECT id, name_cl FROM gen_services WHERE time_st_serv='$time' and date_serv='$date' and num_box='3'");
    2.                                         $sel2 = mysql_query("SELECT id FROM gen_services WHERE time_st_serv<'$time' and date_serv='$date' and time_end_serv>'$time' and num_box='3'");
    3.                                        
    но все равно загрузка идет около 5 секунд
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    https://php.ru/manual/function.microtime.html
    в начале скрипта напиши define("START_TIME", microtime(true));

    потом везде пиши echo 1000 * (microtime(true) - START_TIME);

    и станет понятно когда что происходит
     
  7. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Спасибо, сейчас попробую
     
  8. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Проверил. Время уходит на запросы к БД
     
  9. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Убрал один запрос и немного подредактировал код. Время сократилось в два раза. На одно расписание время загрузки составило около 1с. Но так как у меня на одной странице три расписания, то время на загрузку выходит около 3-х сек.
    Получился такой код, на мой взляд минимальный
    PHP:
    1. for ($i=0; $i < 24; $i++) {
    2.                                     $t = $i / 2;
    3.                                     if ($t < 5) {
    4.                                         $h = '0';
    5.                                     }
    6.                                     else {
    7.                                         $h = '';
    8.                                     }
    9.                                     for ($j=0; $j < 6; $j++) {
    10.                                         $time = $h.$i.':'.$j.'0:00';
    11.                                         $time3 = $h.$i.':'.$j.'0';
    12.                                         $sel1 = mysql_query("SELECT id, name_cl, time_st_serv, time_end_serv FROM gen_services WHERE time_st_serv='$time' and date_serv='$date' and num_box='1' || time_st_serv<'$time' and date_serv='$date' and time_end_serv>'$time' and num_box='1'");
    13.                                         $row1 = mysql_num_rows($sel1);
    14.                                         if ($row1) {
    15.                                             $tim1 = mysql_fetch_assoc($sel1, MYSQL_ASSOC);
    16.                                             $name_cl = $tim1['name_cl'];
    17.                                             $time_st1 = mb_substr($tim1['time_st_serv'],0,5,'UTF-8'); // 1 запрос
    18.                                             $time_end1 = mb_substr($tim1['time_end_serv'],0,5,'UTF-8');
    19.                                             $time_g = $time_st1.'-'.$time_end1;
    20.                                             if($time_st1 == $time3){
    21.                                                 $db = 'display: block;';
    22.                                                 $text = $name_cl;
    23.                                             } elseif($time_st1<$time3 && $time_end1>$time3){
    24.                                                 $db = 'display: none;';
    25.                                                 $text = '';
    26.                                             }
    27.                                            
    28.                                         } else {
    29.                                             $text = 'Свободно';
    30.                                             $db = 'display: block;';
    31.                                             $time_g = $time3;
    32.                                         }
    33.                                         echo '<div style="'.$db.'" class="block-serv"><p style="margin: 0;">'.$time_g.'&nbsp;&nbsp;&nbsp;'.$text.'</p></div>';
    34.                                     }
    35.                                 }
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Запросы в цикле - зло, которое тебя и привело к проблеме подууммай как организовать по другому
     
  11. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    спасибо. я уже думал, но пока без результата. может позже мысль придет.
     
  12. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    В твоем случае можно было оптимизировать все намного проще:
    PHP:
    1. <?php
    2. $link = mysqli_connect("localhost", "my_user", "my_password", "world");
    3.  
    4.  
    5. $query = "SELECT * FROM gen_services WHERE num_box='1'";
    6. $result = mysqli_query($link, $query);
    7.  
    8. $row = mysqli_fetch_array($result, MYSQLI_NUM);
    9. $rs = 0;
    10. for ($i=0; $i < 24; $i++) {
    11.     for ($j=0; $j < 6; $j++) {
    12.         $t = $i / 2;
    13.         if ($t < 5) {
    14.             $h = '0';
    15.         }
    16.         else {
    17.             $h = '';
    18.         }
    19.         $time = $h.$i.':'.$j.'0:00';
    20.         $time3 = $h.$i.':'.$j.'0';
    21.         if( $row['time_st_serv'] == $time && $row['data_serv'] == $data ) {
    22.             $db = 'display: block;';
    23.             $text = $name_cl;
    24.             $time_st1 = mb_substr($row['time_st_serv'],0,5,'UTF-8'); // 1 запрос
    25.             $time_end1 = mb_substr($row['time_end_serv'],0,5,'UTF-8');
    26.             $time_g = mb_substr($time_st1,0,5,'UTF-8').'-'.mb_substr($time_end1,0,5,'UTF-8');
    27.             $rs=1;
    28.         }
    29.  
    30.         if( $row['time_st_serv'] < $time && $row['data_serv'] == $data && $row['time_end_serv'] > $time ) {
    31.             $db = 'display: none;';
    32.             $rs=1;
    33.         }
    34.         $name_cl = $row['name_cl'];
    35.  
    36.         if( $rs == 0 ) {
    37.             $text = 'Свободно';
    38.             $db = 'display: block;';
    39.             $time_g = $time3;
    40.         }
    41.         echo '<div style="'.$db.'" class="block-serv"><p style="margin: 0;">'.$time_g.'&nbsp;&nbsp;&nbsp;'.$text.'</p></div>';
    42.     }
    43. }
    --- Добавлено ---
    И перейди ты уже на mysqli или PDO, расширение mysql_* уже давно умерло - это как использовать бейсик для создания игры. )
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ты запроси все занятые промежутки на целый день сначала, а потом в цикле проверяй, входит ли время в один из них, или нет
    --- Добавлено ---
    А так ты каждые 10 минут отдельно запрашиваешь, конечно, базу убьёшь нахрен
     
  14. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Я уже пишу на PDO, просто вся программа в которой нужно расписание написана на старом mysql