PHP — использование foreach для хранения значений массива сеансов для отправки в базу данных

#php #database

#php #База данных

Вопрос:

Обновление: использование foreach не требуется, но это единственный известный мне способ доступа к массиву сеансов

У меня есть массив сеансов, который содержит в себе несколько значений. Я хочу вставить эти значения в базу данных.

Вот что я сделал:

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

Почему бы мне просто не вставить внутри каждого цикла for? Я не могу, потому что я попробовал это, и он не вставил бы его, потому что OrderDetails .OrderID может быть не НУЛЕВЫМ, что означает, что я не могу вставить без OrderID.

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

Пример ввода:

 [prodID] => array{
  [0] => 25
  [1] => 5
}

[qty] => array{
  [0] => 3
  [1] => 5
}
 

Приведенный мною код отправил бы 5 prodID и 5 qty

Каким я хочу, чтобы мой вывод был:

25,5 prodID отправлено в базу данных

3,5 кол-во отправлено в базу данных

При необходимости я могу привести различные примеры того, что я пытался.

 <?php
//first file
  session_start();

  $prodID = $_SESSION['prodID'];
  $quantity = $_SESSION['qty'];

  $Oquery = "select * from Orders";
  $result = $db -> Oquery($query);

  while($row = $result -> fetch()){
      $orderID = $row['OrderID'];
}
 foreach($prodID as $arrayProd){

  }
  foreach($quantity as $arrayQuantity){

  }
$sql = "INSERT INTO OrderDetails (OrderID,ProductID,Quantity)
                  Values('$orderID','$arrayProd','$arrayQuantity')";
                $exec = $db -> exec($sql);

?>
 
 <?php
//second file
session_start();

$orderNum = $_GET['orderID'];

$query = "SELECT * FROM OrderDetails WHERE OrderID = $orderNum";
$result = $db -> query($query);
  while($row= $result->fetch(PDO::FETCH_ASSOC)){
        $prodID = $nrow['ProductID'];
        $quantity = $nrow['Quantity'];

        echo"ProdID<br>
        $quantity<br>";
}
?>
 

Комментарии:

1. В вашем примере кажется, что prodID 25 имеет qty значение 3, а prodID 5 имеет qty значение 5. Почему тогда вы хотели бы, чтобы «25,5 prodID было отправлено в базу данных» и «3,1 кол-во отправлено в базу данных» ? Разве это не должно быть 25,3 и 5,5?

2. опечатка, моя ошибка, prodID => 25,5 . Кол-во => 3,5

Ответ №1:

Если я правильно понимаю, вам не нужен 2-й foreach внутри 1-го для каждого. В принципе, 1 foreach будет достаточно. Пример:

 foreach($prodID as $key => $data)
{
 $sql = "INSERT INTO OrderDetails (OrderID,ProductID,Quantity)
        Values('$orderID','$data','$qty[$key]')";
        $exec = $db -> exec($sql);    
}
 

Это воздушный код, непроверенный. Но идея должна помочь. Отправьте ответ, если у вас есть вопрос.

Комментарии:

1. Работает как шарм, никогда не думал об этом

2. Рад, что это помогло вам. Но помните, что опасения «kmoser» действительны. Я бы переосмыслил весь процесс.

Ответ №2:

В вашем подходе есть несколько проблем:

  1. Вы предполагаете, что заказы в Orders таблице будут извлекаться в той же последовательности, в какой они отображаются в массивах $_SESSION['prodID'] and $_SESSION['qty'] . Без ORDER BY предложения в вашем SELECT * FROM Orders , вы действительно не можете сделать это предположение.
  2. Вы предполагаете, что количество заказов в Orders таблице будет точно соответствовать количеству элементов в $_SESSION .

Несмотря на эти (и другие) вопросы, это решение может сработать для вас:

 <?php
  session_start();

  $prodID = $_SESSION['prodID'];
  $quantity = $_SESSION['qty'];

  $Oquery = "select * from Orders";
  $result = $db -> Oquery($query);

  $i = 0;
  while($row = $result -> fetch()){
    $orderID = $row['OrderID'];

    $pid = $prodID[$i];
    $qty = $quantity[$i];

    // Should probably do some check here to ensure $prodID[$i] and $quantity[$i] are valid, before attempting the INSERT

    $sql = "INSERT INTO OrderDetails (OrderID,ProductID,Quantity) VALUES ('$orderID','$pid','$qty')";

    $exec = $db -> exec($sql);
    $i  ;
  }
?>
 

Комментарии:

1. Те же результаты, что и в моем решении, он отправляет последнее значение в массиве.

2. я повторяю «$ pid, $ qty»; чтобы увидеть, что отправляется в переменную, и она правильно выводит их оба.