@GoodNickStar

Как принять разные данные поля input при переборе данных с помощью foreach?

В общем делаю корзину для интернет-магазина. При нажатии на кнопку "добавить в корзину", в массив-сессии записывается (id - товара, и его количество). Далее на странице корзины, перебирается этот массив-сессии, и вызывается функция для получения данных по id товара. У каждого товара есть поле количество (input), где в значении value вставлено значение количества из массива-сессии. Так вот как принять и обновить (если пользователь изменил количество) данные поля input, для каждого элемента? У меня получается принять данные только последнего поля, из-за цикла.
Как можно решить эту проблему?
Вот код страницы корзины:
<? require "functions.php"; ?>
  <div class="center">
    <div class="content">
      <div class="goods-content">
        <h3>Корзина</h3>
<? if(isset($_SESSION["cart"])): ?>
        <table class="table">
          <tr>
            <th>№</th>
            <th>Товар</th>
            <th>Стоимость</th>
            <th>Количество</th>
            <th>Общая стоимость</th>
            <th></th>
          </tr>
<? $count = 1; ?>
<form action="?action_bash=update_cart" method="post">
  <? if ($_SESSION["flag_result"] == true): ?>
    <? $_SESSION["total_price"] = 0; ?>
  <? endif; ?>

  <? foreach ($_SESSION["cart"] as $id=>$quantity): ?>
    <? $goods = output_goods_from_id($id)?> // функция для получения данных о товаре
    <tr>
      <td>
        <strong><?=$count; ?></strong>
        <input type="hidden" name="id" value="<?=$goods["id"];?>">
      </td>
      <td>
        <a href="?goods_id=<?=$goods["id"];?>"><img src="images/catalog/<?=$goods["image"]; ?>"></a>
        <p><strong><?=$goods["title1"]; ?></strong><br><?=$goods["title2"]; ?></p>
      </td>
      <td>

        <? if ($quantity >= 100): ?> // цена со скидкой
          <input type="hidden" name="fin_price" value="<?= $goods["price2"]?>">
          <?=$price = $goods["price2"]?>
        <? else: ?>
          <?=$price = $goods["price1"]?>
          <input type="hidden" name="fin_price" value="<?= $goods["price1"]?>">
        <? endif;?>

      </td>
      <td>
        <button type="button" class="btn btn-link" value="down" onclick="change('down', <?=$count?>);"><i class="glyphicon glyphicon-minus"></i></button>
          <input class="input-count" name="count" type="text" value='<?=$quantity; ?>' id="<?=$count?>">
        <button type="button" class="btn btn-link" value="up" onclick="change('up', <?=$count?>);"><i class="glyphicon glyphicon-plus"></i></button>

      </td>
      <td>
        <? $result = $quantity * $price; ?>
        <strong><?=$result; ?></strong>
        <? if ($_SESSION["flag_result"] == true): ?>
          <? $_SESSION["total_price"] += $result; ?>
        <? endif; ?>
      </td>
      <td>
        <a href="bash/remove_goods.php?goods_id=<?=$goods["id"]?>"><i class="glyphicon glyphicon-remove"></i></a>
      </td>
    </tr>
  <? $count++;?>
  <? endforeach; ?>
<? $_SESSION["flag_result"] = false; ?>
        </table>
<? else: ?>
  <h3>К корзине ничего нет</h3>
<? endif; ?>

        <h3 style="text-align: right; clear:both;">Итого: <?=$_SESSION["total_price"]?> руб.</h3>
        <br>
          <button type="submit" class="btn btn-success btn-lg" role="button" style="float:right;"
                  id="loading-example-btn" data-loading-text="Обновление цен...">
            Обновить и подтвердить
          </button>
</form>
      </div>
    </div>
  </div>

<script>
  function change(a, id) {
    var val = parseInt(document.getElementById(id).value);
    if (a == 'up')
      document.getElementById(id).value = val + 1;
    else if (a == 'down') {
      if (val != 1)
        document.getElementById(id).value = val - 1;
    }
  }

</script>
  • Вопрос задан
  • 2453 просмотра
Пригласить эксперта
Ответы на вопрос 2
Может это вам поможет? pastebin.com/UC32nZRS
Ответ написан
@ryko_goop
не знаю насколько еще актуально. Я сегодня столкнулся с той же ситуацией, когда при отправке данных с формы отправляется только данные выведенные циклом foreach последнего инпута.
решается это очень просто. Надо чтобы у каждого выводимого foreach-ем инпута были уникальные атрибуты name.
Сделал это так:
$i=1;
foreach($goods as $item){
				
if($item['id'] and $item['name']){
				?>
	<tr>
		<td class="admin"><input name='<?php echo "ID".$i;?>' type='text' size='3' value='<?echo $item['id'];?>'/></td>
		
		<td class="admin"><textarea name='<?php echo "text_zadachi".$i;?>' cols="auto" rows="auto"><?echo $item['text_zadachi'];?></textarea></td>
		
		<td class="admin"><?echo $item['status'];?>
		<select name='<?php echo "status".$i;?>'>
					<option value="1">Выполнено</option>
					<option value="0">Не выполнено</option>
		</select>
		</td>
	</tr>
				<?
				$i++;}
			}
			?>
т.е. по факту у тебя получиться первое 
ID1 text_zadachi1 status1
ID2 text_zadachi2 status2 
и т.д.
Запись в БД так же осуществлять циклом
for($i=1;$i<=3;$i++){
			$id=$_POST['ID'.$i];
			$status=$_POST['status'.$i];
			$text_zadachi=$_POST['text_zadachi'.$i];
            тут вызов метода записи в БД
}
таким образом он их все поочередно запишет в базу данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы