У меня проблема с частью кода, в которой через foreach я прохожу массив, и те, которые соответствуют определенным условиям, обновляются значением UPDATE. Проблема в том, что я пытаюсь передать значения со скрытым вводом и обновляю только последнее значение. Как я могу изменить код, чтобы я мог делать это с массивами?
try {
$add = "UPDATE calculo SET puntaje_fecha=:puntaje_fecha WHERE id_calculo=:id_calculo";
$d = $conn->prepare($add);
$d->bindParam(':puntaje_fecha', $_POST['puntaje_fecha']);
$d->bindParam(':id_calculo', $_POST['id_calculo']);
$d->execute();
} catch (PDOException $e) {
die("Error: " . $e->getMessage() . "<br>on line: " . $e->getLine() . "<br>on file: " . $e->getFile());
}
<form action = "actualizar.php" method = "post">
<?php foreach ($ca as $c){?>
<?php foreach ($pr as $p) {}?>
<?php if (($p['id_fecha'])==($c['nFecha'])){
//actions to be taken if the conditions are met
}?>
<input type = "hidden" name = "puntaje_fecha" value = "<?php echo $s; ?>">
<input type = "hidden" name = "id_calculo" value = "<?php echo $c['id_calculo']; ?>">
<?php }} ?>
<input type = "submit" value = "Actualiza puntos">
</form>
Мне нужно, чтобы в моей таблице «calculo» все значения «puntaje_fecha» обновлялись, если они соответствуют этому условию. Многие люди рекомендовали мне изменить имя входа на массивы, но я не знаю, как это сделать. Большое спасибо всем, кто может мне помочь.
Точно, я знаю, что ошибка там. Проблема в том, что я не знаю, как сделать, чтобы выполнить эту часть моей программы.






Вы можете изменить код ниже
<input type = "hidden" name = "puntaje_fecha" value = "<?php echo $s; ?>">
<input type = "hidden" name = "id_calculo" value = "<?php echo $c['id_calculo']; ?>">
за это:
<input type = "hidden" name = "puntaje_fecha[]" value = "<?php echo $s; ?>">
<input type = "hidden" name = "id_calculo[]" value = "<?php echo $c['id_calculo']; ?>">
Вышеприведенное обрабатывает формы ввода как массив, поэтому в вашем контроллере получают данные следующим образом:
$puntajes = $_POST["puntaje_fecha"]; //array
$idsCalculo = $_POST["id_calculo"]; //array
Вы можете построить запрос с помощью простого foreach:
foreach($puntajes as $index => $puntaje) {
updateData($puntaje, $idsCalculo[$index]); // call the new function for update
}
function updateData($puntaje, $idCalculo) {
$add = "UPDATE calculo SET puntaje_fecha=:puntaje_fecha WHERE id_calculo=:id_calculo";
$d = $conn->prepare($add);
$d->bindParam(':puntaje_fecha', $puntaje);
$d->bindParam(':id_calculo', $idCalculo);
$d->execute();
$message = '';
if ($d->execute()) {
$message = 'DATOS ACTUALIZADOS';
} else {
$message = 'ERROR DE ACTUALIZACION';
}
} catch (PDOException $e) {
die("Error: " . $e->getMessage() . "<br>on line: " . $e->getLine() . "<br>on file: " . $e->getFile());
}
}
надеюсь я помог
Большое спасибо, у меня есть одно сомнение. foreach($puntajes as $index => $puntaje) { updateData($puntaje, $idsCalculo[$index]); // call the new function for update } Куда добавить?
Хорошо, замените ваш текущий foreach на мой, и я предлагаю создать новую функцию в вашем текущем скрипте с именем updateData($puntaje, $idsCalculo[$index]); что он будет вызываться внутри функции foreach.
Вы создаете только два входа с именами «puntaje_fecha» и «id_calculo».
Таким образом, значение с последней итерации публикуется, чтобы опубликовать все значения, измените скрытые входы на массив.
<input type = "hidden" name = "puntaje_fecha[]" value = "<?php echo $s; ?>">
<input type = "hidden" name = "id_calculo[]" value = "<?php echo $c['id_calculo']; ?>">
Убедитесь, что ваши входные данные выглядят так, как показано ниже, проверив элемент, в противном случае проверьте свои данные в $ca и $pr
<input type = "hidden" name = "puntaje_fecha[]" value = "value_1">
<input type = "hidden" name = "id_calculo[]" value = "value_1">
<input type = "hidden" name = "puntaje_fecha[]" value = "value_2">
<input type = "hidden" name = "id_calculo[]" value = "value_2">
<input type = "hidden" name = "puntaje_fecha[]" value = "value_3">
<input type = "hidden" name = "id_calculo[]" value = "value_3">
В вашем блоке try через foreach обновите каждое значение в массиве.
try {
$puntaje_fechaArray = $_POST['puntaje_fecha'];
$id_calculoArray = $_POST['id_calculo'];
foreach ($puntaje_fechaArray as $key => $val){
$puntaje_fecha = $val[$key];
$id_calculo = $id_calculoArray[$key];
$add = "UPDATE calculo SET puntaje_fecha=:puntaje_fecha WHERE id_calculo=:id_calculo";
$d = $conn->prepare($add);
$d->bindParam(':puntaje_fecha', $puntaje_fecha );
$d->bindParam(':id_calculo', $id_calculo);
$d->execute();
}
} catch (PDOException $e) {
die("Error: " . $e->getMessage() . "<br>on line: " . $e->getLine() . "<br>on file: " . $e->getFile());
}
Спасибо! Но где вы говорите добавить скрытый ввод я не могу понять. Я не могу изменить его по одному, потому что количество исправлений в таблице будет постоянно меняться, пока работает преограмма. Извините, если я не понимаю, массивы сложны для меня.
@MarcosAlborelli Измените имя входов на «puntaje_fecha[]» и «id_calculo[]», это создаст несколько входов в виде массива в зависимости от длины массива в foreach. Кроме того, используйте foreach в своем блоке try, поскольку вы будете получать данные в виде массива .
<?php foreach ($ca as $c){?> <?php foreach ($pr as $p) {}?> <?php if (($p['id_fecha'])==($c['nFecha'])){ //actions to be taken if the conditions are met }?> <input type = "hidden" name = "puntaje_fecha[]" value = "<?php echo $s; ?>"> <input type = "hidden" name = "id_calculo[]" value = "<?php echo $c['id_calculo']; ?>"> Понимаю, у меня только вопрос что делать с $ca
Вам не нужно ничего делать с $ca, так как вы уже проходите через него, используя цикл foreach.
Вы создаете свою форму в цикле, но атрибут
nameсгенерированных полей тот же, поэтому вы получаете только последнее значение