0

I am a student, this is week 5 learning php/mySQL. I've pretty much gathered that there's an undefined variable somewhere but I can't seem to find where. I have changed the variable names to productID product_id to no avail all over the document, and tried to echo the variable just in the html and still get the same error. I am getting this error:

<br /><b>Notice</b>:  Undefined variable: product in <b>D:\xampp\htdocs\ch05_ex1\product_manager\product_edit.php</b> on line <b>10</b><br />

<br /><b>Notice</b>:  Undefined variable: product in <b>D:\xampp\htdocs\ch05_ex1\product_manager\product_edit.php</b> on line <b>15</b><br />

<br /><b>Notice</b>:  Undefined variable: product in <b>D:\xampp\htdocs\ch05_ex1\product_manager\product_edit.php</b> on line <b>20</b><br />

<br /><b>Notice</b>:  Undefined variable: product in <b>D:\xampp\htdocs\ch05_ex1\product_manager\product_edit.php</b> on line <b>25</b><br />

When I try to update a form this is supposed to populate with the product information

This is in my index

<?php
require('../model/database.php');
require('../model/product_db.php');
require('../model/category_db.php');

$action = filter_input(INPUT_POST, 'action');
if ($action == NULL) {
    $action = filter_input(INPUT_GET, 'action');
    if ($action == NULL) {
        $action = 'list_products';
    }
}
//ACTION TO LIST PRODUCTS

if ($action == 'list_products') {
    $category_id = filter_input(INPUT_GET, 'category_id', 
            FILTER_VALIDATE_INT);
    if ($category_id == NULL || $category_id == FALSE) {
        $category_id = 1;
    }
    $category_name = get_category_name($category_id);
    $categories = get_categories();
    $products = get_products_by_category($category_id);
    include('product_list.php');
    
//ACTION TO EDIT PRODUCTS   
    
}  if ($action == 'edit_product') {
    $category_id = filter_input(INPUT_POST, 'category_id', FILTER_VALIDATE_INT);
    $code = filter_input(INPUT_POST, 'code');
    $name = filter_input(INPUT_POST, 'name');
    $price = filter_input(INPUT_POST, 'price');
    if ($category_id == NULL || $category_id == FALSE || 
    empty($code)|| empty($name) || 
    $price == NULL || $price == FALSE) {
    $error = "Invalid product data. Check all fields and try again.";
    include('../errors/error.php');
    } else { 
        edit_product($category_id, $code, $name, $price);
        header("Location: .?category_id=$category_id");
    }

This is in my product_list these are my buttons

<?php foreach ($products as $product) : ?>
            <tr>
                <td><?php echo $product['productCode']; ?></td>
                <td><?php echo $product['productName']; ?></td>
                <td class="right"><?php echo $product['listPrice']; ?></td>
                
                <td><form action ="product_edit.php" method="post"
                            value="category_id">
                            
                    <input type="hidden" name="product_id"
                           value="edit_product">
                    <input type="hidden" name="product_id"
                           value="<?php echo $product['productID']; ?>">
                    <input type="hidden" name="category_id"
                           value="<?php echo $product['categoryID']; ?>">
                    <input type="submit" value="Edit">
                </form></td>

This is my function in my product_db

    function edit_product($category_id, $code, $name, $price) {
        global $db;
        $query = 'UPDATE products
                  SET categoryID = :category_id,
                      productCode = :code,
                      productName = :name,
                      listPrice = :price
                    WHERE productID = :product_id';
    $statement = $db->prepare($query);
    $statement->bindValue(':category_id', $category_id);
    $statement->bindValue(':code', $code);
    $statement->bindValue(':name', $name);
    $statement->bindValue(':price', $price);
    $statement->bindValue(':product_id', $product_id);
    $statement->execute();
    $statement->closeCursor();
}
?>

And this is my product_edit form

<?php include '../view/header.php'; ?>
<main>
     <h1>Edit Product</h1>
        <form action="index.php" method="post" id="add_product_form">
<input type="hidden" name="action"
  value="<?php echo $product['productID']; ?>">

        <label>Category ID:</label>
<input type="input" name="category_id"
      value="<?php echo $product['categoryID']; ?>">
<br>
         
        <label>Code:</label>
        <input type="input" name="code"
      value="<?php echo $product['productCode']; ?>">
        <br>

        <label>Name:</label>
        <input type="input" name="name"
      value="<?php echo $product['productName']; ?>">
        <br>

        <label>List Price:</label>
        <input type="input" name="price"
      value="<?php echo $product['listPrice']; ?>">
        <br>

        <label>&nbsp;</label>
        <input type="submit" value="Save Changes"><br>
<br>

        </form>
    <p class="last_paragraph">
        <a href="index.php?action=list_products">View Product List</a>
    </p>

</main>
<?php include '../view/footer.php'; ?>
  • The error message is clearly telling you that the variable `$product` has not been defined in `product_edit.php`. In `product_list.php` you are looping over `$products` to assign the `$product` variable. Are you doing the same in `product_edit.php`? – timgavin Sep 26 '22 at 03:10
  • I do not have a loop in my product_edit.php it's just the html and the echos – Ali Gorey Sep 26 '22 at 03:13
  • I tried to add the loop to product_edit.php and this is the error I got. Parse error: syntax error, unexpected end of file in D:\xampp\htdocs\ch05_ex1\product_manager\product_edit.php on line 40 – Ali Gorey Sep 26 '22 at 03:27

1 Answers1

0

When you call down $product[..…] in your edit form the variables have not been initialized first time around, probably the array is not in scope to the script and cannot be set although the $product[..…] array has been initialized. Seems more likely one page script requires the other initialized by correct initialization sequence when called.

Samuel Marchant
  • 331
  • 2
  • 6