0
votes

I had this working then when I added the new category Quantity it now produces this error.

Undefined offset: 0 in (the form values)

I cannot see where the undefined offset is. Any help would be appreciated.

I also know mysql is depreciated but want it working before changing.

As a note, all the data is recalled to the edit form it is when you process it, it produces that error

Also the query has been validated and runs.

Edit Function

function edit_product($id, $name, $description, $price, $quantity, $picture, $category) {

      $id           = (int) $id;  
      $category     = (int) $category;
      $name         = mysql_real_escape_string($name);
      $description  = mysql_real_escape_string($description);
      $price        = mysql_real_escape_string($price);
      $quantity     = (int) $quantity;
      $picture      = mysql_real_escape_string($picture);



      mysql_query("UPDATE `shop` SET 

      `prod_id`         = {$category},
      `name`            = '{$name}',
      `description`     = '{$description}',
      `price`           = '{$price}',
      `quantity`        = '{$quantity}',
      `picture`         = '{$picture}'
      WHERE `id`        = {$id}");

    echo mysql_error();
    }

Edit page

    $post = get_posts($_GET['id']);

    if ( isset($_POST['name'], $_POST['description'], $_POST['price'], $_POST['quantity'], $_POST['picture'], $_POST['category']) ) {
    $errors = array();

        $name           = trim($_POST['name']);
        $description    = trim($_POST['description']);
        $price          = trim($_POST['price']);
        $quantity       = trim($_POST['quantity']);
        $picture        = trim($_POST['picture']);


        if ( empty($name) ) {
            $errors[] = 'You need to supply a title';
        }   else if ( strlen($name) > 255 ) {
        $errors[] = 'Title cannot be longer than 255 characters';
        }

        if ( empty($description) ) {
        $errors[] = 'You need to supply text';
        }

        if ( empty($price) ) {
        $errors[] = 'You need to supply text';
        }

        if ( empty($quantity) ) {
        $errors[] = 'You need to supply text';
        }

        if ( empty($picture) ) {
        $errors[] = 'You need to supply text';
        }

        if (! category_exists('id', $_POST['category']) ) {
        $errors[] = 'Category does not exist';

        }

        if ( empty($errors) ) {
        edit_product($_GET['id'], $name, $description, $price, $quantity, $picture, $_POST['category']);
        header("Location: ../admin/edit_products.php?id={$post[0]['post_id']}");
        die();
        }
    }
    ?>

.....

<label for="name">Title</label>
<input type="text" name="name" value="<?php echo $post[0]['name']; ?>"><br/>
<label for="price">price</label>
<input type="text" name="price" value="<?php echo $post[0]['price']; ?>"><br/>

<label for="sale">Quantity</label>
<input type="text" name="quantity" value="<?php echo $post[0]['quantity']; ?>"><br/>
<label for="picture">Picture</label>
<input type="text" name="picture" value="<?php echo $post[0]['picture']; ?>"><br/>


<label for="description">Description</label>
<textarea  name="description" rows="15" cols="50"><?php echo $post[0]['description']; ?></textarea><br/>


<label for="prod_id">Category</label>
<select name="category">
<?php
foreach ( get_categories() as $category ) {
$selected = ( $category['name'] == $post[0]['name'] ) ? " selected" : '';
?>

<option value="<?php echo $category['id']; ?>" <?php echo $selected; ?>> <?php echo $category['name']; ?></option>


--------------

Get Post function - As requested.

function get_posts($id = null, $cat_id = null) {
    $posts = array();

    $query ="SELECT  `shop`.`id` AS  `post_id` ,  `products_cat`.`id` AS  `category_id` , `shop`.`name` ,  `description` ,  `price` ,  `quantity` ,  `picture` 
FROM  `shop` 
INNER JOIN  `products_cat` ON  `shop`.`prod_id` =  `products_cat`.`id` ";

    if ( isset($id) ) {
    $id = (int) $id;
    $query .= " WHERE `shop`.`id` = {$id}";
    }

    if ( isset($cat_id) ) {
        $cat_id = (int) $cat_id;
        $query .= " WHERE `products_cat`.`id` = {$cat_id}";
}

    $query .= " ORDER BY `shop`.`price` DESC";

    $query = mysql_query($query);
    echo mysql_error();
    while ( $row = mysql_fetch_assoc($query) ) {
        $posts[] = $row;
        }

    return $posts;
}
1
Are you sure it's in your edit function and not somewhere you're referencing $post[0]...? - WWW
I'm just looking at your code and seeing you have prod_id = {$category}, - Should't it be prod_id = '{$category}', - With the '? ... Just checking... - John Bustos
Please, don't use mysql_* functions in new code. They are no longer maintained and are officially deprecated. See the red box? Learn about prepared statements instead, and use PDO or MySQLi - this article will help you decide which. If you choose PDO, here is a good tutorial. - Naftali
is $post an array? What exactly does this get_posts() function do? - Marc B
Is $post = get_posts($_GET['id']); returning an array or is it empty? Might want to run a print_r($post) to make sure it is getting something. Otherwise $post[0] doesn't exist. - Pitchinnate

1 Answers

1
votes

First thing please dont use mysql_ and go for mysqli_

For a while , In above code

Undefined offset: 0 error is cooming from lines as you said 

<input type="text" name="price" value="<?php echo $post[0]['price']; ?>">

This is because the value at that index $post[0]['price'] has not been set yet.

Just replace it with

 <?php echo isset($post[0]['price'])?$post[0]['price']:''; ?> 

in the value attribute.

Hope it will help you!