загрузка цикла while занимает слишком много времени

#php #sql #ajax #while-loop

#php #sql #ajax #цикл while

Вопрос:

У меня проблемы со временем загрузки. Я попытался удалить первый оператор if-else, и он работает очень быстро, но не при добавлении обратно. У меня более 40000 строк в таблицах.

 while ($qry->fetch()){
    $form .= "
        <div class='formSections' id='formSections-$formSectionCounter'>
        <h4 style='text-align: center; color: white; width: 100%; font-size: 20px; margin: 10px auto;'>$sname</h4>
    ";

    $qry2 = $con->prepare("SELECT FieldId, FieldName, FieldType, FieldFilter, DisplaySubSection from qrp.agency_webform_section_fields where SectionId = ? ORDER BY FieldOrder ASC");
    // $response_array['data'] .= $con->error;
    $qry2->bind_param("s", $sid);
    $qry2->execute();
    $qry2->store_result();
    if ($qry2->num_rows > 0)
    {
        $qry2->bind_result($fid, $fname, $ftype, $ffilter, $DisplaySubSection);
        while ($qry2->fetch())
        {

            if($DisplaySubSection != ''){
                $form .= "
                    <h4 style='text-align: center; color: white; width: 100%; font-size: 20px; margin: 10px auto;'>$DisplaySubSection</h4>
                ";
            }

            unset($defval);
            unset($dov);
            unset($doid);
            unset($iof);
            unset($reqf);
            $qry3 = $con->prepare("SELECT DefaultValue,IncludeOnForm,Required from qrp.agency_webform_fields where WebformId = ? and FieldId = ?");
            $qry3->bind_param("ss", $wfid, $fid);
            $qry3->execute();
            $qry3->store_result();
            if ($qry3->num_rows > 0)
            {
                //FOUND FIELD IN Webform
                $qry3->bind_result($defval, $iof, $reqf);
                $qry3->fetch();
                if ($defval != '')
                {
                    $qry4 = $con->prepare("SELECT OptionValue,OptionId from qrp.agency_webform_field_options where OptionId = ?");
                    $qry4->bind_param("s", $defval);
                    $qry4->execute();
                    $qry4->store_result();
                    if ($qry4->num_rows > 0)
                    {
                        $qry4->bind_result($dov, $doid);
                        $qry4->fetch();
                    }
                    else
                    {
                        $dov = $defval;
                    }

                }
            }

            $form .= "
                <div class='BothinputsAndLabelsAndCheckbox'>
                <div class='inputsAndLabels'>
                    <label>$fname</label>";
                    if ($ftype == 'String' || $ftype == 'INT'){
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='text' class='' value='$dov' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                    } else if ($ftype == 'Date'){
                        $date = date('Y-m-d', strtotime($dov));
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='date' class='' value='$date' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                    } else if ($ftype == 'Checkbox'){
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='checkbox' class='' value='$dov' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                    } else if ($ftype == 'SelectList'){
                        $form .= "
                        <select name='$fid-default' id='$fid-default' class='' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>";
                            $qry3 = $con->prepare("SELECT OptionValue,OptionId,FieldFilterId from qrp.agency_webform_field_options where FieldId = ? Order By OptionValue");
                            $qry3->bind_param("s", $fid);
                            $qry3->execute();
                            $qry3->store_result();
                            $form .= "<option value=''>Please Select an Option</option>";
                            if ($qry3->num_rows > 0)
                            {
                                $qry3->bind_result($optv, $optid, $filid);
                                while ($qry3->fetch())
                                {
                                    if (!isset($defval))
                                    {
                                        $form .= "<option value='$optid' id='$filid' class='$filid'>$optv</option>";
                                    }
                                    else
                                    {
                                        if ($doid == $optid)
                                        {
                                            $form .= "<option value='$optid' id='$filid' class='$filid' selected>$optv</option>";
        
                                        }
                                        else
                                        {
                                            $form .= "<option value='$optid' id='$filid' class='$filid'>$optv</option>";
        
                                        }
                                    }
                                }
                            }
                            $form .= "                          
                        </select>
                        ";
                    }
                    $form .= "
                </div>"; // end inputsAndLabels div
                    $form .= "
                        <div class=''>
                            <div class='includeDiv'>
                                <input type='checkbox' class='includeButton' id='$fid-include' data-value='$fid' name='$fid-include' "; if ($iof > 0){ $form .= " checked"; }$form .= " data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                                <label class='' for='$fid-include'> Include</label>
                            </div>";
                            if ($ftype != 'Checkbox'){
                                $form .= "
                                <div class='requiredDiv'>
                                    <input type='checkbox' class=' requiredButton' id='$fid-required' data-value='$fid' name='$fid-required' "; if ($reqf > 0){ $form .= " checked"; }$form .= " data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                                    <label class='' for='$fid-required'> Require </label>
                                </div>
                                ";
                            }
                            $form .= "
                        </div>
            </div>
            ";
        }
    }
    $form .= "
    </div> <!-- close formSections -->
    ";

    $formSectionCounter  ;
}
 

Комментарии:

1. Возможно, попробуйте выполнить подкачку данных, если это работает для вашего приложения

2. У вас есть три вложенных цикла, каждый из которых повторяет набор результатов и выполняет вызовы вашей базы данных. Первое, что нужно сделать, это отсортировать ваши запросы, чтобы получить все ваши данные в одном запросе и выполнить итерацию по ним для создания вашей страницы.

Ответ №1:

Если вы выполняете цикл более 40000 строк, это в принципе не проблема. Проблема возникает, если для каждой выбранной строки вы готовите новую инструкцию SQL для выбора связанной информации для каждого идентификатора строки. В вашем примере вы создаете как минимум в 40000 раз больше строк в последующих операторах SQL selects, new select, и это замедляет загрузку страницы

Вы можете решить эту проблему, расширив свой первый оператор SQL с помощью Left Join или subselect, чтобы получить все данные за одну итерацию выборки SQL.

Я предлагаю сохранить ваши результаты в массивах. Не путайте подготовку SQL и разметку HTML. Это делает код намного чище, и как только вы получили свои данные с оптимизированным SQL в массивы, вы можете искать проблему намного лучше. Создайте свою HTML-разметку, как обычно, с вложенными циклами, но внутри этих циклов получите доступ к вашим массивам, которые вы предварительно заполнили данными из базы данных.

Комментарии:

1. Также: отформатируйте свои SQL-запросы, чтобы повысить читаемость, и переключите регистр для $ftype вместо if-else . И правильно отформатируйте свой код с помощью программы форматирования кода! При использовании визуального кода используйте marketplace.visualstudio.com /… Я знаю, это много критических предложений, но оптимизация начинается с чистого форматирования кода. Сделайте это как можно проще для себя и всех, кто просматривает ваш код: D

2. Спасибо, что нашли время ответить!

3. Добро пожаловать! Не стесняйтесь обращаться за необходимой вам помощью: D