Обновите несколько записей с помощью foreach

У меня проблема с частью кода, в которой через 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» обновлялись, если они соответствуют этому условию. Многие люди рекомендовали мне изменить имя входа на массивы, но я не знаю, как это сделать. Большое спасибо всем, кто может мне помочь.

Вы создаете свою форму в цикле, но атрибут name сгенерированных полей тот же, поэтому вы получаете только последнее значение

Cid 15.05.2019 16:36

Точно, я знаю, что ошибка там. Проблема в том, что я не знаю, как сделать, чтобы выполнить эту часть моей программы.

Marcos 15.05.2019 16:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете изменить код ниже

<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 } Куда добавить?

Marcos 15.05.2019 17:04

Хорошо, замените ваш текущий foreach на мой, и я предлагаю создать новую функцию в вашем текущем скрипте с именем updateData($puntaje, $idsCalculo[$index]); что он будет вызываться внутри функции foreach.

Daniel Luna 15.05.2019 17:21
Ответ принят как подходящий

Вы создаете только два входа с именами «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());
}

Спасибо! Но где вы говорите добавить скрытый ввод я не могу понять. Я не могу изменить его по одному, потому что количество исправлений в таблице будет постоянно меняться, пока работает преограмма. Извините, если я не понимаю, массивы сложны для меня.

Marcos 15.05.2019 17:18

@MarcosAlborelli Измените имя входов на «puntaje_fecha[]» и «id_calculo[]», это создаст несколько входов в виде массива в зависимости от длины массива в foreach. Кроме того, используйте foreach в своем блоке try, поскольку вы будете получать данные в виде массива .

Rahat Hameed 15.05.2019 17:29
<?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
Marcos 15.05.2019 17:39

Вам не нужно ничего делать с $ca, так как вы уже проходите через него, используя цикл foreach.

Rahat Hameed 15.05.2019 18:14

Другие вопросы по теме