dongxiaoxing3058 2019-04-29 19:47
浏览 38

购物车问题与更新数量和从购物车中删除项目

I am trying to work on a homework assignment involving adding items to a cart and updating them and removing items from the cart. So far I have been able to add items but now I'm facing issues with the updating of the quantity and removing of items. Could anyone please assist me? Thank you.

<?php
session_start();
include 'dbconnect.php';
include 'functions.php';

// Create an empty cart if it does not exist 
if (!isset($_SESSION['cart'])) {
$_SESSION['cart']=array();
}
// Add an item to the cart

$title = $_GET['title'];

$quantity = $_GET['quantity'];

if ($quantity > 0) { 
    $_SESSION['cart'][$title]= round($quantity,0);

    //create an array of current items in the cart
    $items = array();

    if(isset($_GET['remove']) && (!empty($_GET['remove'] || 
$_GET['remove'] == 0))){
    unset($_SESSION['cart'][$_GET['remove']]);
}

?>
 <!DOCTYPE html>
 <html>    
 <head>
 <title>BOOK SHOP</title>
 <link rel="stylesheet" type="text/css" href= "main.css" />
 </head>
<body>
<form>
<input type="button" value="Go back" onclick="history.back()">
 </form>

    <h1>Your Cart </h1> 

    <?php
    $grand_total = 0;

    echo '<table border = "1">  <tr> <th>  Book Name </th>  <th>  Price 
    </th> <th> Qty</th> <th> Total</th></tr> '; 
    foreach ($_SESSION['cart']as $title => $quantity) {

        // get book data
        $result =get_product_data($title);


        $items[$title]
        ['bookname'] =$result[0][2];
        $items[$title]
        ['listPrice'] = $result[0][3]; 
        $items[$title]
        ['quantity']=$quantity;

        $book_total = $result[0][3] * $quantity;
        $grand_total +=$book_total;

        echo  '<tr>'; 
        echo  '<td>' . $items[$title]['bookname'] . '</td>';
        echo  '<td>' . $items[$title]['listPrice'] . '</td> ';
        echo  "<td><input type='text' class='form-control' 
     name='value'".$items[$title]['quantity'] ."'></td>";

        echo  '<td>' .  sprintf('$%.2f',$book_total) . '</td>';
        echo '<td><a href="?remove=' . $title . '">remove</a></td>';
        echo  '</tr>';


    }
    }   
    echo "<td><input type= 'submit' name='even' value='Update' class='btn 
  btn-warning'></td>";
    echo '<tr> <td>&nbsp</td>     <td>&nbsp</td>  <td>TOTAL</td> <td>' . 
  sprintf('$%.2f',$grand_total) . '</td> ';
    echo '</table>';    
    ?>


   </body>
    </html>

The expected result should be when I remove an item, it removes the item. When updating the quantity, it will update the price and quantity. Instead I receive errors related to an undefined variable and index:

When I remove an item, I get the following:

Notice: Undefined index: title in C:\xampp\htdocs\book_apps\Book Database Connect\add_to_cart.php on line 12
Notice: Undefined index: quantity in C:\xampp\htdocs\book_apps\Book Database Connect\add_to_cart.php on line 14
Notice: Undefined variable: grand_total in C:\xampp\htdocs\book_apps\Book Database Connect\add_to_cart.php on line 73 TOTAL $0.00

  • 写回答

1条回答 默认 最新

  • dongren5293 2019-04-29 21:30
    关注

    So, I spent a good amount of time looking over your code to see what you're trying to achieve. Without writing everything out for you, here's a very basic example with no validation to get you started. You can add in the product info from your database, as well as the actual online store piece that would allow you to add items to your cart, etc. I added a form with method "POST" to handle submitting updated quantities or removing an item. There are plenty of other better alternatives out there for handling this sort of cart logic, but as it looks like you're newer to PHP, I figured I would help with some basics to give you an idea of how things function within an OOP paradigm.

    <?php
    session_start();
    
    /* for testing purposes, unset cart session on each run of code if you need to simulate
    adding new items to the cart */
    //unset($_SESSION['cart']); 
    
    // Create an empty cart if it does not exist
    if (!isset($_SESSION['cart']))
    {
        $_SESSION['cart'] = [];
    
        // For testing purposes, add cart session data on each run of code
        // This info would come from database and be set here via ADD button, etc.
        // Comment out if you want nothing in cart on run of page
        $_SESSION['cart'][] = array('book_id' => 1, 'quantity' => 2);
        $_SESSION['cart'][] = array('book_id' => 2, 'quantity' => 1);
    
        // DEBUGGING
        //echo "<pre>";
        //print_r($_SESSION['cart']);
        //exit;
    }
    
    function updateItem($book_id, $quantity, $action) {
        foreach ($_SESSION['cart'] as $key => $cart_item)
        {
            if($cart_item['book_id'] === $book_id) {
                 if($action === 'remove') {
                   unset($_SESSION['cart'][$key]);
                 } else if($action === 'update') {
                    $_SESSION['cart'][$key]['quantity'] = $quantity;
                 } else {
                   // some other default action   
                 }
                return;
            }
        }
    }
    
    function updateBulkItems($itemsWithQuantity) {
        foreach($itemsWithQuantity as $key => $itemArr) {     
            $book_id = key($itemArr);
            $quantity = $itemArr[$book_id];
            updateItem($book_id, $quantity, 'update');
        }
    }
    
    // Process cart actions update/remove
    if (isset($_POST) && !empty($_POST) && is_array($_POST))
    {
        // DEBUGGING
        //echo "<pre>";
        //print_r($_POST);
        //exit;
    
        $postedData = $_POST;
        switch($postedData) {     
            case isset($postedData['remove']):
               // do remove logic here w/ database/session
               updateItem(key($postedData['remove']), null, 'remove');
            break;
    
            case isset($postedData['update']):
               // do update logic here w/ database/session
               updateBulkItems($postedData['quantity']);
            break;
    
            default:
    
            break;
        }    
    }
    
    $grand_total = 0;
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <title>
                BOOK SHOP
            </title>
            <link rel="stylesheet" type="text/css" href= "main.css" />
        </head>
        <body>
            <form>
                <input type="button" value="Go back" onclick="history.back()">
            </form>
            <h1>
                Your Cart 
            </h1>
            <?php
    
    /**
    * This product info would come from database, etc.
    * Find book info from ID passed in
    * @param $book_id
    */
    function get_product_data($book_id) {
    
        // Mock database return data..
        $product_array = [];
        $product_array[] = array('id' => 1, 'title' => 'Title 1', 'book_name' => 'Book Name 1', 'total' => 5.99);
        $product_array[] = array('id' => 2, 'title' => 'Title 2', 'book_name' => 'Book Name 2', 'total' => 3.99);
    
        foreach($product_array as $key => $product) {
            if($product['id'] === $book_id) {
                 return $product;   
            }
        }    
        return [];
    }
    
    echo '<form id="cart_form" method="POST">';
    echo '<table border="1"><tr><th>Book Name</th><th>Price</th><th>Qty</th><th>Total</th></tr>';
    
    foreach ($_SESSION['cart'] as $key => $cart_item)
    {
        // get book data
        $book_id = $cart_item['book_id'];
        $product_info = get_product_data($book_id);
        if(count($product_info) == 0) {
          continue;
        }
        $book_total = $cart_item['quantity'] * $product_info['total'];
        $grand_total += $book_total;
        echo '<tr>';
        echo '<td>' . $product_info['book_name'] . '</td>';
        echo '<td>' . $product_info['total']. '</td> ';
        echo "<td><input type='text' class='form-control' 
    name='quantity[][".$book_id."]' value='" . $cart_item['quantity']. "'></td>";
        echo '<td>' . sprintf('$%.2f',  $book_total) . '</td>';
        echo '<td><input type="submit" name="remove['.$book_id.']" value="Remove" class="btn"></a></td>';
        echo '</tr>';
    }
    
    if(count($_SESSION['cart']) > 0) {
        echo "<td><input type='submit' name='update' value='Update' class='btn'></td>";
    }
    echo '<tr> <td>&nbsp</td><td>&nbsp</td><td>TOTAL</td><td>' . sprintf('$%.2f', $grand_total) . '</td>';
    echo '</table>';
    echo '</form>';
    ?>
        </body>
    </html>
    
    评论

报告相同问题?