skip to Main Content

Background:

I have a database table regarding various products. This database table is called product. The columns are set as id | group_id | model | description | price | .

id = the product id.
group_id = identifies the group that this product belongs too. 
model = product model 
description = Description
price = Price

From this table I generate a dynamic table based on the group_id of table product.

      <table>
<tr>
    <th>Model</th>
    <th>Description</th>
    <th>Price</th>
    <th>QTY</th>
</tr>  
 <?php        
   $conn = mysqli_connect("localhost", "root", "root", "test");
    // Check connection
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }
  $sql ="SELECT * FROM product WHERE group_id = 2";
  $result = $conn->query($sql);
  while($row = $result->fetch_assoc()) :

 ?>      
     <tr>
    <td><?php echo $row['model']; ?></td>
    <td><?php echo $row['description']; ?></td>
    <td>R <?php echo $row['price']; ?></td>
    <td><input type="number" name = "<?php echo $row['id']?>" value = 0></td>

    </tr>
 <?php endwhile; ?>   


  </table>
   <div class="input-group">
  <button type="submit" class="btn" name="save">Save and Return</button>
  </div>
  </form>

This works well. Once this table is generated it allows the user to edit the quantity of each product that would fall under that group id, upon submit using POST, the information is sent to config_824.php

Please see code below for this file.

    <?php
session_start();
include ('customer_details_config.php');
$quote_id = $_SESSION['quote_id'];
$salesman_id = $_SESSION['salesman_id'];


$db = mysqli_connect('localhost', 'root', 'root', 'test');

 if (isset($_POST['save_pan_han'])){
    unset($_POST['save_pan_han']);
    foreach($_POST as $key => $value):
    $test_query = "SELECT * FROM quote_items WHERE quote_id = $quote_id AND prod_id = $key AND rep_id = $salesman_id";
    $result = mysqli_query($db, $test_query);
    $item = mysqli_fetch_assoc($result) or die (mysqli_error($db));


    if($item['quote_id'] == $quote_id &&
    $item['prod_id'] == $key &&
    $item['rep_id'] == $salesman_id){


           $update_query = "UPDATE quote_items SET
                    qty = $value

                    WHERE 

                    quote_id = $quote_id
                    AND prod_id = $key
                    AND rep_id = $salesman_id
                    ";
                    mysqli_query($db,$update_query) or die (mysqli_error($db));


        }else{
            $query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)" ;
        mysqli_query($db,$query) or die (mysqli_error($db));

        }
    endforeach;
}
?>

$quote_id is set with $_SESSION['quote_id'] and $salesman_id is set with $_SESSION['salesman_id'] when the user logs in.

quote items table has columns called id, quote_id, prod_id, rep_id, qty

CREATE TABLE `project`.`quote_items` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `quote_id` INT(10) NOT NULL , `prod_id` INT(10) NOT NULL , `rep_id` INT(10) NOT NULL , `qty` INT(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

As per the code above, I am trying to insert the data into a database table called quote_items, if I insert test data into the database, the UPDATE query runs fine.

The problem:

The issue is that if it checks and the row is not in the database, the INSERT query does not work. Nor do I see any errors despite error showing = TRUE.

I will use the following example:
I have six rows of test data in the database. The dynamic table allows for 8 values to be set and sent to the database. So say the first two values are already in the database and would comply with UPDATE query. Value 3 and 4 has not yet been inserted and would fall under INSERT query. Value 5, 6, 7 and 8 again fall under the Update query.

If I run the code. Only row 1 and 2 would be updated. Row 3 and 4 would not be inserted and row 5, 6, 7, 8 would not be updated.

What I have tried:

Stackoverflow using
mysqli_autocommit($db,FALSE);

Copy the query and insert into database via SQL in phpMyAdmin, if I remove the variables from the query it works fine on INSERT.

As you can see in the code above, I have an unset($var) as I noticed when I echo the array that the array included the table name. This is a string. If I try inserting a string this would cause issues obviously and I thougt this would resolve the issue.

This was sadly not the case.

Testing by removing the if and elseif and only using insert as recommended in a comment below:

<?php

    include ('customer_details_config.php');
    $quote_id = $_SESSION['quote_id'];
    $salesman_id = $_SESSION['salesman_id']; 


    $db = mysqli_connect('localhost', 'root', 'root', 'test');

    if (isset($_POST['save_pan_han'])):
        foreach($_POST as $key => $value): 
        $test_query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)";
            $result = mysqli_query($db, $test_query) or die (mysqli_error($db));

    /* 
    $item = mysqli_fetch_assoc($result) ;

     if ($item['quote_id'] == $quote_id &&
            $item['prod_id'] == $key &&
            $item['rep_id'] == $salesman_id
           ){
            $update_query = "UPDATE quote_items SET
            qty = $value

            WHERE 

            quote_id = $quote_id
            AND prod_id = $key
            AND rep_id = $salesman_id
            ";
            mysqli_query($db,$update_query) or die (mysqli_error($db));

        }else{ 
            $query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)" ;
            mysqli_query($db,$query) or die (mysqli_error($db));
        } 

       */
  endforeach;
endif;


?>

3

Answers


  1. Chosen as BEST ANSWER

    I finally got the result I wanted. Well almost.

        $db = mysqli_connect('localhost', 'root', 'root', 'test');
    
     if (isset($_POST['save_pan_han'])){
        unset($_POST['save_pan_han']);
        foreach($_POST as $key => $value):
    
         $query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) SELECT $quote_id, $key, $salesman_id, $value WHERE NOT EXISTS (SELECT quote_id, prod_id, rep_id, qty FROM quote_items WHERE quote_id = $quote_id AND prod_id = $key AND rep_id = $salesman_id)";
            mysqli_query($db,$query) or die (mysqli_error($db));
    
         endforeach;
    
         foreach($_POST as $key => $value):
    
         $test_query = "SELECT * FROM quote_items WHERE quote_id = $quote_id AND prod_id = $key AND rep_id = $salesman_id";
        $result = mysqli_query($db, $test_query);
        $item = mysqli_fetch_assoc($result) or die (mysqli_error($db));
    
        if($item['quote_id'] == $quote_id &&
        $item['prod_id'] == $key &&
        $item['rep_id'] == $salesman_id){
    
    
               $update_query = "UPDATE quote_items SET
                        qty = $value
    
                        WHERE 
    
                        quote_id = $quote_id
                        AND prod_id = $key
                        AND rep_id = $salesman_id
                        ";
                        mysqli_query($db,$update_query) or die (mysqli_error($db));
    
            }
    
    
        endforeach;
    
    }
    ?>
    

    The only issue is that this now also would insert rows where qty = 0

    I will just include a DROP query. If anyone has a better suggestion, please add. I know I am making too many calls to the database for this to be the best solution.


  2. Add single quotes around the values in your insert statement like you did in your update statement so they are properly recognized as strings in SQL.

    Except for the fields that aren’t strings of course, but since you didn’t post your create table script that’s impossible to tell from your code.

    Also using string concatenation to build SQL statements is a horrible security issue and you absolutely must use PDO and prepared statements!

    Login or Signup to reply.
  3. Is there a reason you are adding ” to the column names when you are inserting?
    When you are fdoing UPDATE you do not do that.

    Replace this:

    "INSERT INTO quote_items ('quote_id', 'prod_id', 'rep_id', 'qty') VALUES ($quote_id, $key, $salesman_id, $value)"
    

    With:

    "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)"
    

    Or maybe you wanted to use this: `

    "INSERT INTO quote_items (`quote_id`, `prod_id`, `rep_id`, `qty`) VALUES ($quote_id, $key, $salesman_id, $value)"
    

    Check this DEMO

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search