#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