Создайте foreach для значения, которое существует дважды

1

У меня есть следующая инструкция: 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();
}
  • 0
    Попробуйте использовать array_push($_POST["ProductName"], $stmt->fetch(PDO::FETCH_ASSOC)); добавить его в массив вместо перезаписи значения $_POST["ProductName"]
  • 0
    Каково ваше требование? Вы можете использовать MySQL отличную функцию, чтобы предотвратить повторяющиеся значения.
Показать ещё 3 комментария
Теги:

2 ответа

1

Вы можете создать новый массив (например, $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
}
  • 0
    Я бы инициализировал $rows = array(); внутри catch для предотвращения ошибок в цикле foreach случае сбоя запроса.
  • 0
    Я добавил полный процесс того, что я пытаюсь достичь. То, что у меня есть, работает, но только если для идентификатора заказа назначен ОДИН продукт, если у меня два, он не обновляется правильно.
Показать ещё 2 комментария
0

Вы можете создать массив, используя 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
}
  • 0
    Спасибо за помощь мне. Я так понимаю, первый предоставленный вами блок кода будет ниже первого catch, а сам цикл foreach будет обходить оставшуюся часть try и catch?
  • 0
    Отметьте галочкой этот ответ, если он вам полезен. Спасибо

Ещё вопросы

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