Использование одного запроса для заполнения меню множественного выбора HTML PHP

#php #html

#php #HTML

Вопрос:

Это скорее вопрос оптимизации кода, чем обычный прямой вопрос с проблемой, требующей решения. У меня есть 4 меню выбора, которые получают свои значения из SQL-запроса. Проблема в том, что я повторяю один и тот же запрос 4 раза, чтобы заполнить список меню выбора 4. Вот код SQL.(Я использую PHP с SQL Server 2008)

  <select name="cities" id="" class="brkcity" style="width:120px;">
       <option></option>
        <?php
    foreach($country as $makassi1){ $selectcities = "SELECT City, Country, Rate FROM tblPerdiem_Rates WHERE Country = '$makassi1'";$checkcity = sqlsrv_query($conn,$selectcities, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ))or die(print_r( sqlsrv_errors(), true));

 while($row=sqlsrv_fetch_array($checkcity))
 {

     $countries = ($row['Country']);
     $names =($row['City']) ;
     $rate =($row['Rate']) ;
     $ratess=$names."-".$countries
     ?> 

 <option id="cityoptrates"  value="<?php echo $rate; ?>"><?php echo $ratess; ?></option>
 <?php       
 }
 }  
 sqlsrv_free_stmt($checkcity);      
         ?>
      </select></td>
      <td width="93" id="tdbreakfast"><input name="brkfastchk" class="breko" type="checkbox" value=""    id="" />
        <label for="brkfasttxt"></label>
        <input style="" value=""   name="brkfasttxt" class="breko" type="text" id="" size="3" readonly="readonly" />
      <label for="brkfastchk"></label></td>
      <td width="133" id="tdlnchcities"><select name="cities" id="" class="lnhcity" style="width:120px;">
       <option></option>
        <?php foreach($country as $makassi1) { $selectcities = "SELECT City, Country, Rate FROM tblPerdiem_Rates WHERE Country = '$makassi1'"; $checkcity = sqlsrv_query($conn,$selectcities, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ))or die(print_r( sqlsrv_errors(), true));


 while($row=sqlsrv_fetch_array($checkcity))
 {

     $countries = ($row['Country']);
     $names =($row['City']) ;
     $rate =($row['Rate']) ;
     $ratess=$names."-".$countries
     ?> 

 <option id="cityoptrates"  value="<?php echo $rate; ?>"><?php echo $ratess; ?></option>
 <?php       
 }   
 }sqlsrv_free_stmt($checkcity); 
         ?>
      </select>
 

Это код, который я использую для заполнения меню списка. Но мне это не нравится, поскольку неэффективно повторять один и тот же запрос 4 раза на одной странице. Я попытался поместить запрос и часть «для каждого» в верхней части страницы, а затем использовать часть «while» в html-части меню выбора, но это сработало только для первого меню. Остальное оказалось пустым.

Могу ли я сделать это лучше, чем это, или это так хорошо, как получается? Вся помощь приветствуется

Ответ №1:

Кэшируйте результаты одного запроса в массиве, затем используйте этот массив для заполнения выпадающих списков:

 $data = array()
while($row = sqlserv_fetch_array($checkcity)) {
   $data[] = $row;
}
 

Затем выполните цикл foreach вместо while / fetch:

 foreach($data as $row) {
     $countries = $row['Country'];
     $city = $row['City'];
     $rate = $row['rate'];
     etc...
}
 

Обновить

вы также можете кэшировать «за $ makassi1», если это необходимо:

 while(...) {
    $data[$makassi1][] = $row;
}
 

Однако подумайте о том, чтобы переписать свой запрос, чтобы использовать join или какую-либо другую структуру, чтобы вы не выполняли так много почти идентичных запросов так много раз.

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

1. Это работает, если у вас нет инструкции foreach для влияния на результат. Внимательно ознакомьтесь с моим кодом… для каждого элемента я выбираю необходимые детали. Это работает, только если у меня есть только один элемент в первом foreach(страна как makassi1)