У меня есть следующая инструкция: SELECT
ProductName
и Quantity
из таблицы orderDetails
. Смотри ниже:
try {
$stmt = $conn->prepare("SELECT ProductName, Quantity FROM orderDetails WHERE OrderID = :OrderID");
$stmt->bindParam(':OrderID', $_SESSION['newOrderID'], PDO::PARAM_INT);
$stmt->execute();
$_POST['ProductName'] = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
Если $_POST['ProductName']['ProductName']
существует более одного раза, как я могу создать цикл foreach на основе этого?
То, что я пробовал до сих пор...
foreach($_POST['ProductName']['ProductName']) {
}
Это не сработало...
Что я сделал не так?
Полный код:
try {
$stmt = $conn->prepare("SELECT ProductName, Quantity FROM orderDetails WHERE OrderID = :OrderID");
$stmt->bindParam(':OrderID', $_SESSION['newOrderID'], PDO::PARAM_INT);
$stmt->execute();
array_push($_POST["ProductName"], $stmt->fetch(PDO::FETCH_ASSOC));
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
// echo $_POST['ProductName']['ProductName'];
// echo $_POST['ProductName']['Quantity'];
try {
$stmt1 = $conn->prepare("SELECT Stock FROM products WHERE ProductName = :ProductName");
$stmt1->bindParam(':ProductName', $_POST['ProductName']['ProductName']);
$stmt1->execute();
$_POST['Stock'] = $stmt1->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
// echo $_POST['Stock']['Stock'];
$_POST['DEDUCT'] = $_POST['Stock']['Stock'] - $_POST['ProductName']['Quantity'];
try {
$stmt2 = $conn->prepare("UPDATE products SET Stock = :Stock WHERE ProductName = :ProductName");
$stmt2->bindParam(':Stock', $_POST['DEDUCT']);
$stmt2->bindParam(':ProductName', $_POST['ProductName']['ProductName']);
$stmt2->execute();
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
Вы можете создать новый массив (например, $rows
), который содержит все извлеченные данные, используя функцию fetchAll()
(fetch()
только извлекает следующую строку).
Самый простой способ сделать это:
try {
$stmt = $conn->prepare("SELECT ProductName, Quantity FROM orderDetails WHERE OrderID = :OrderID");
$stmt->bindParam(':OrderID', $_SESSION['newOrderID'], PDO::PARAM_INT);
$stmt->execute();
//Add all returned values to an array called "$rows"
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
Затем, если вы хотите получить доступ к этим данным позже, вы сможете:
foreach($rows as $row){
var_dump($row); //Show the data in the row to double-check
}
$rows = array();
внутри catch
для предотвращения ошибок в цикле foreach
случае сбоя запроса.
Вы можете создать массив, используя foreach следующим образом:
$newval_arr = array();
foreach($_POST['ProductName']['ProductName'] as $key=>$value) {
if(!in_array($value,$newval_arr) || empty($newval_arr))
{
$newval_arr[] = $value;
}
}
Затем после использования $ newval_arr в foreach
foreach($newval_arr as $key=>$value)
{
//Your code herer
}
array_push($_POST["ProductName"], $stmt->fetch(PDO::FETCH_ASSOC));
добавить его в массив вместо перезаписи значения$_POST["ProductName"]