#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:
В вашем подходе есть несколько проблем:
- Вы предполагаете, что заказы в
Orders
таблице будут извлекаться в той же последовательности, в какой они отображаются в массивах$_SESSION['prodID']
and$_SESSION['qty']
. БезORDER BY
предложения в вашемSELECT * FROM Orders
, вы действительно не можете сделать это предположение. - Вы предполагаете, что количество заказов в
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»; чтобы увидеть, что отправляется в переменную, и она правильно выводит их оба.