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

Контекст: У меня есть форма заказа, в которой есть выбор HTML и ввод числа.Таким образом, пользователь выбирает элемент и вводит желаемую сумму этого элемента, они отправляются в виде массивов на страницу Hander.$_POST['item']; - это массив идентификаторов, с помощью которых я хочу выбрать информацию о продукте из базы данных.$amount = $_POST['amount']; - это просто массив сумм каждого элемента.

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

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

handle.php

<code><?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 "
";?>

1 Ответ

0 голосов
/ 04 июня 2018

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

$key = array() ;

сразу после вашего

foreach ($amount as $key) 

Это вызывает ваши

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

чтобы попытаться отобразить массив, потому что вы перезаписали значение $ key, присвоенное 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 () уже перебирает строки, возвращенные для этих элементов.Это предполагает, что у вас есть только один продукт на номер изделия.

Если вы ожидаете, что для каждого номера элемента будет возвращаться один или более 'products', то вы должны выполнять 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']] ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...