Сохранение элементов корзины в базу данных

#php #html

#php #HTML

Вопрос:

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

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

 <?php 
    session_start();
    include("DBConn.php");
    $msg = "";

    if(isset($_POST["add_to_cart"]))
    {
        if(isset($_SESSION["shopping_cart"]))
        {
            $item_array_id = array_column($_SESSION["shopping_cart"], "item_id");
            if(!in_array($_GET["id"], $item_array_id))
            {
                $count = count($_SESSION["shopping_cart"]);
                $item_array = array(
                    'item_id'           =>  $_GET["id"],
                    'item_name'         =>  $_POST["hidden_item"],
                    'item_price'        =>  $_POST["hidden_price"],
                    'item_quantity'     =>  $_POST["quantity"]
                );
                $_SESSION["shopping_cart"][$count] = $item_array;
            }
            else
            {
                echo '<script>alert("Item Already Added")</script>';
                echo '<script>window.location="book_a_venue.php"</script>';
            }
        }
        else
        {
            $item_array = array(
                    'item_id'           =>  $_GET["id"],
                    'item_name'         =>  $_POST["hidden_item"],
                    'item_price'        =>  $_POST["hidden_price"],
                    'item_quantity'     =>  $_POST["quantity"]
            );
            $_SESSION["shopping_cart"][0] = $item_array;
        }
    }
?>
  

Это код, который я использовал для извлечения элементов из сеанса и его отображения, каждый элемент отображается в форме, которая создается динамически. Это элементы, которые я хотел бы вставить в свою базу данных, чтобы сохранить заказ.

 <?php
    if(!empty($_SESSION["shopping_cart"])){
        $total = 0;
        foreach($_SESSION["shopping_cart"] as $keys => $values)
        {
?>
                                    
<form method="post" action="cart.php?action=removeamp;id="id" class="cart-items">
    <div class="border rounded">
        <div class="row bg-white">
           <div class="col-md-6">
              <h4 class="text-info"><?php echo $values["item_name"]; ?></h4>
              <h4 class="text-danger">Price: R <?php echo $values["item_price"]; ?></h4>
              </br>
              <a href="cart.php?action=deleteamp;id=<?php echo $values["item_id"]; ?>"><span class="btn btn-danger mx2">Remove</span></a>
            </div>
            <div class="col-md-3 py-5">
               <div>
               <h5>Quantity</h5>
               </br>
               <h4 name="quantity" class="text-info"><?php echo $values["item_quantity"]; ?></h4>
               <h3>R <?php echo number_format($values["item_quantity"] * $values["item_price"], 2);?></h3>
            </div>
          </div>
       </div>
    </div>
</form>

<?php
    $total = $total   ($values["item_quantity"] * $values["item_price"]);
    }
}
?>
  

Это то, что я пытался сделать, чтобы вставить элементы из корзины в базу данных. Что не работает и, вероятно, совершенно неправильно.

 <?php
    if (isset($_POST['submit'])){
        
        if(!empty($_SESSION["shopping_cart"])){
            $total = 0;
            
            
            
            foreach($_SESSION["shopping_cart"] as $keys => $values)
            {
            $stmt = $con->prepare("INSERT INTO tbl_order (`item`, `price`, `quantity`, `totalprice`, `total`) VALUES (?, ?, ?, ?, ?)");
            $stmt->bind_param("sss", $item, $price, $quantity, $totalprice, $total);
            
            $item = $values["item_name"];
            $price = $values["item_price"];
            $quantity = $values["item_quantity"];
            $totalprice = $values["item_quantity"] * $values["item_price"];
            $total = $total   ($values["item_quantity"] * $values["item_price"]);
            $stmt->execute();
            }           
            $stmt->close();
            $con->close();          
        }   
?>

<div class="col-md-4 offset-md-1 border rounded mt-5 bg-white h-25">
  <div class="pt-4">
    <h6>
        PRICE DETAILS
    </h6>
    <hr>
        <div class="row price-details">
            <div class="col-md-6">
            <h6>
                Delivery Charges
            </h6>
            <hr>
            <h6>
            Amount Payable
            </h6>
            <hr>
            <h6>
            Grand Total
            </h6>
            <hr>
            <input type="button" value="Continue Shopping" class="btn btn-warning" id="btnHome" onClick="document.location.href='book_a_venue.php'"/>   
        </div>
                
        <div class="col-md-6">
            <h6 class="text-success">
                FREE
            </h6>
            <hr>
            <h6>
            R <?php echo number_format($total, 2);?>
            </h6>
            <hr>
            <h6>
            R <?php echo number_format($total, 2);?>
            </h6>
            <hr>
            <button type="submit" name="submit" class="btn btn-danger mx-2">Check Out</button>
        </div>
    </div>
</div>
</div>
<?php
    }
?>
  

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

1. Это не совсем неправильно, вы на правильном пути, единственная проблема, которую я вижу, заключается в том, что вы не объединяете строки в своем INSERT запросе. Я оставлю этот вопрос кому-то более опытному в PHP, чтобы дать лучший ответ (это, вероятно, не единственная проблема). 1 за использование mysqli вместо mysql (многие новички, которых я вижу, склонны использовать mysql , что устарело и представляет угрозу безопасности при неправильном использовании).

2. @AStopher Спасибо, на самом деле это был вотум доверия ко мне, и, будучи студентом, я долгое время сталкивался с проблемой и пытался всеми способами получить помощь в этом.

3. @Dharman Я знаю об инъекциях SQL и в настоящее время работаю над этим в переделке этого проекта

4. Можете ли вы показать нам обновленный код? Тот, который использует привязку параметров? У вас все еще возникают проблемы с подготовленным заявлением?

5. @Dharman прав, это может быть решено, если вы перейдете на параметризованные подготовленные операторы (их не сложно освоить), потому что это также решит проблему объединения строк. Если вы сделали это и у вас все еще возникают проблемы, отредактируйте свой вопрос, чтобы добавить обновленный код.

Ответ №1:

Я исправил свою проблему, довольно глупую проблему, у меня никогда не было <form method="post"></form> кнопки оформления заказа, теперь все правильно вставляется в базу данных. Спасибо всем, кто помогал мне, это действительно поможет мне улучшить мой код.