简体   繁体   中英

Shopping cart issue with updating the quantity and removing items from the cart

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

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM