2015-08-19 1 views
0

Следующий сценарий должен обновить мою базу данных, столбец среды с выбранным значением для раскрывающегося меню. Прямо сейчас, последний хост получает значение 0. Что я делаю неправильно? Похоже, я не могу отслеживать хосты и значение, которое было выбрано.Сценарий выпадающего меню PHP не обновляет базу данных

while($row = mysql_fetch_array($result)){ 

$host = $row['host']; 
$environment = $row['environment']; 

echo "<tr><td>" . $host . "</td> 
     <td><select name='id[".$host."]'><option value='Null'>Select any</option> 
           <option value='DEV/QA/TEST'>DEV/QA/TEST</option> 
           <option value='PROD/STAGE'>PROD/STAGE</option> 
           </select></td> 
           <td>" . $environment . "</td></tr>"; } 


echo "</tbody></table><input type='submit' value='submit'></form>"; 

if (gettype($_POST['id'])=="array") { 

    foreach($_POST['id'] as $host => $val){ 

      $id_c = $val; 
if ($val != 'Null') { 
      $query1 = "UPDATE hosts SET environment = '$val' where host='$host'"; 

      $result1 = mysql_query($query1); 

      if($result1 === false) { 

      die(mysql_error()); 
     } 

    echo "Environment for Host " .$host. " is updated. <br>"; 

}}} 

Обновлено рабочим сценарием.

+0

Прежде всего, ради бога, прекратите использовать функции mysql_. Он устарел много лет назад. Во-вторых, вы применяете обновление, где столбец sql равен переменной $ host, но $ host - это переменная, которая принадлежит тому, который уже закрыт в этой точке. Поскольку вы используете «мертвую» локальную переменную из цикла, вы приводите только последний результат этого запроса в ваш цикл. Другими словами, ваш foreach всегда обновляет тот же $ host. –

+0

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

+0

Если бы я был вами, я бы передал идентификатор хоста в качестве аргумента внутри id. Вместо имени select будет 'id []', что невозможно отслеживать его происхождение, я бы использовал 'id [] '. Поэтому в вашем foreach вы можете использовать это: 'foreach ($ _ POST ['id'] as $ hostId => $ val)' –

ответ

0

Ваш код является неправильным. Я попытаюсь объяснить, что вы сейчас делаете, и как вы должны иметь код.

Первая ошибка:

while($row = mysql_fetch_array($result)) { 
    echo '<select name="id[]">'; 
    [...] 
} 

Вы создаете один select хостом (это нормально). Но как только он будет создан, вы не можете сказать, какой select подходит для какого хоста. Единственный способ, которым вы можете сказать это, - это порядок, который он показывает, это не очень надежный.
Я предлагаю вам идентифицировать ваш select с идентификатором хоста (или любым имеющимся у вас идентификатором).
Как это:

while($row = mysql_fetch_array($result)) { 
    echo '<select name="id['.$row['host_id'].']">'; 
    [...] 
} 

Вторая ошибка:

while($row = mysql_fetch_array($result)) { 
    $host = $row['host']; 
} 
// Here, $host contains the last row 

foreach ($_POST['id'] as $val) { 
    // UPDATE $host with $val 
} 

Что здесь происходит: вы обновляете последний хост с каждым выберите значение, которое вы прошли через форму.

Вот что вы должны сделать:

while($row = mysql_fetch_array($result)) { 
    echo '<select name="id['.$row['host_id'].']">'; 
    [...] 
} 

foreach ($_POST['id'] as $host_id => $val) { 
    // UPDATE hosts SET environment = $val WHERE host_id = $host_id 
} 

Таким образом, вы будете обновлять каждый хост для каждого соответствующего значения $_POST['id'].
Вы можете использовать print_r($_POST), чтобы узнать его структуру.

+0

Можете ли вы, пожалуйста, отредактировать мое оригинальное сообщение тем, что он должен делать правильно? Следующая строка начинается с эха «так что» внутри не ценится. эхо "". $ host. " ". $. ""; } –

Смежные вопросы