Я пытаюсь обновить 1 или несколько строк MySQL в PHP, в то время как имена тегов ввода и выбора HTML имеют одно и то же имя атрибута.
Форма отображается в модальном HTML.
Я попытался установить имена тегов HTML в виде массива при передаче скрытого первичного ключа для идентификации каждой строки и, следовательно, обновления этой конкретной строки.
Помимо циклов foreach и for для перебора результатов массива, но безуспешно, строки MySQL не обновляются.
файл modal.php:
<div class = "form-group">
<label>Recipe name</label>
<input type = "text" class = "form-control" name = "recipe_name" value = "<?php echo $row['recipe_name']; ?>" />
</div>
<div class = "form-group">
<label>Crop</label>
<input type = "text" class = "form-control" name = "recipe_crop" value = "<?php echo $row['recipe_crop']; ?>" />
</div>
<?php
$query1 = mysqli_query($mysqli,"SELECT * FROM recipes WHERE recipe_name = '" . $row['recipe_name'] . "' AND recipe_crop = '" . $row['recipe_crop'] . "';");
while ($row2 = mysqli_fetch_array($query1)){
?>
<input type = "hidden" name = "recipe_id[]" value = "<?php $row2['recipe_id']; ?>" readonly>
<hr />
<div class = "form-group">
<label>Hardware</label>
<select name = "hardware[]" class = "form-control">
<option value = "<?php echo $row2['recipe_hardware']; ?>">CURRENTLY: <?php echo $row2['recipe_hardware']; ?></option>
<option value = "LIGHTS">LIGHTS</option>
<option value = "WATER_PUMP">WATER PUMP</option>
</select>
</div>
<div class = "form-group">
<label>Action</label>
<select name = "action[]" class = "form-control">
<option value = "<?php echo $row2['recipe_action']; ?>">CURRENTLY: <?php echo $row2['recipe_action']; ?></option>
<option value = "ON">ON</option>
<option value = "OFF">OFF</option>
</select>
</div>
<?php } ?>
Код обновления PHP:
$rid = $_POST['recipe_id'];
$recipe_hardware = $_POST['hardware'];
$recipe_action = $_POST['action'];
foreach ($rid as $key => $id) {
$sql = "UPDATE recipes SET recipe_hardware = '" . $recipe_hardware[$key] . "', recipe_action = '" . $recipe_action[$key] . "' WHERE recipe_id = '" . $id . "';";
$query1 = $this->db_connection->query($sql);
if ($query1) {
$this->messages[] = "Recipe edited successfully.";
} else {
$this->errors[] = "Recipe not updated.";
}
}
Ожидаемый результат - возможность обновлять только указанные строки.
Кстати, я настоятельно рекомендую вам изучить подготовленные заявления для вашего SQL.
Привет, Доминик, спасибо за быстрый ответ, я пытался изменить его на «. (Int) $ id.», Но, к сожалению, все равно не сработало. Обязательно ознакомлюсь с подготовленной выпиской! Спасибо за совет.






Я предполагаю, что столбец
recipe_idимеет тип данныхint, но в вашем обновлении SQL у вас естьWHERE recipe_id = '" . $id . "'. Эти одинарные кавычки (') вокруг$idпреобразуют его как строку. Должно быть:WHERE recipe_id = " . (int) $id . "