foreach внутри цикла while, возвращающего дублирующиеся данные

0

Контекст: У меня есть форма заказа, в которой есть html select и number input. поэтому пользователь выбирает элемент и вводит сумму, которую они хотят от этого элемента, они отправляются в виде массивов на страницу ручного устройства. $_POST['item']; это массив id, который я хочу выбрать с информацией о продукте из базы данных. $amount = $_POST['amount']; это всего лишь массив сумм каждого элемента.

Проблема. Каждая строка дублируется количеством строк, поэтому в этом случае она возвращает три строки, но дублирует их три раза.

Цель: все, что я пытаюсь сделать, это foreach $_POST['item'] получать данные из базы данных и показывать их и соответствующие суммы в таблице, чтобы пользователь мог подтвердить заказ.

handle.php

<?php 
$item = $_POST['item']; // array of product ids to select data from db
$amount = $_POST['amount']; // array of amounts of each product the user ordered
$note = $_POST['note'];
$i = 0;

$each = implode(',',$item);

$stmt = $dbh->query('SELECT * 
          FROM 'products' 
         WHERE 'id' IN (' . $each . ')');


        <table class="table">
          <thead>
            <tr>
              <th scope="col">Item</th>
              <th scope="col">Quantity</th>
              <th scope="col">Price</th>
            </tr>
          </thead>
          <tbody>

    <?php 
while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {

    $product_id = $row['id'];
    $product_name = $row['name'];
    $product_price = $row['price'];
    $row['quantity'] = $amount[$row['id']];

    print "<pre>";
    print_r($row);
    print "</pre>";
    ?>

    <tr>
     <td><?php echo $product_name;?></td>
     <td><?php echo $row['quantity'];?></td>
     <td><?php echo $product_price;?></td>
    </tr>


<?php } ?>
              </tbody>
            </table>
  • 0
    $stmt->fetch(PDO::FETCH_ASSOC) выбирает одну строку . Почему бы не использовать код, который уже представлен в руководстве?
  • 0
    Сервал сказал мне, что разные люди должны что-то изменить, но не как исправить эту чертову вещь. Я не знаю, что я делаю неправильно ... извините, я просто очень расстроен этим.
Показать ещё 2 комментария
Теги:
foreach

1 ответ

1
Лучший ответ

Я не совсем уверен, что вы пытаетесь сделать, но вы переназначаете

$key = array() ;

сразу после

foreach ($amount as $key) 

Это

<td><?php echo $key;?></td>

чтобы попытаться эхо-массива, потому что вы перезаписали значение ключа $, назначенного foreach.

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

Вы дублируете те же три строки, потому что вы устанавливаете

$new = array_combine($item, $amount);

Тогда ваш SQL захватывает строки

$stmt = $dbh->query('SELECT * 
      FROM 'products' 
     WHERE 'id' IN (' . $each . ')');

Затем вы перебираете те же элементы с помощью

foreach ($new as $key => $val) {

Если вы хотите отобразить элементы, найденные в SQL, тогда вы не должны

foreach ($new as $key => $val) {

внутри цикла while(). Ваш while() уже перебирает строки, возвращаемые для этих элементов. Это предполагает, что у вас есть только один товар на номер позиции.

Если вы ожидаете, что один или несколько "продуктов" будут возвращены для каждого номера позиции, тогда вы должны будете выполнять свой SQL при переходе через foreach ($ new), но это не похоже на то, что делает верхняя часть вашего кода.

После некоторого времени назад мы определили проблему: суммы должны быть привязаны к номерам позиций.

Вы получаете номера и количества предметов в виде массивов из своего HTML. Поэтому вам нужно перебирать элементы и связывать их с вашими количествами.

// where your qualities will live
$quantities = array() ; 

// loop through the array of items you received and match them up with their quantity 
foreach($item as $k=>$id) { 
    $quantities[$id] = $amount[$k] ; 
}

Затем вы можете получить доступ к количеству в вашем цикле while, используя:

$row['quantity'] = $quantities[$row['id']] ;
  • 0
    Вопрос был обновлен, я также добавил обновление о том, какие данные дублируются.
  • 0
    @bob, я добавил информацию, касающуюся вашей проблемы с «дублирующейся строкой».
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню