简体   繁体   中英

Insert multiple rows in to mysql and restrict one of the rows to be entered only once

I have an invoice form which posts multiple rows to an insert page for insertion to multiple rows.My stumbling block is that when I insert the multiple order items with a foreach statement I also insert the invoice gross for each row. How would I go about only inserting for example the "invoice gross amount"on the last line of the insert in a column of my choosing.

I have enclosed the code I am using to insert the form, and before it is mentioned, I have stripped out calls to data cleansing functions for clarity.


<?php 
  //Lets connect to the database
   if(mysqli_connect_errno()){
       exit("Failed to connect to the database".mysqli_connect_error());}
        //We first insert the header line of the purchase invoice, then we get the insert id and switch to the details table and insert 
         //the purchased items details

       $query ="INSERT INTO acc_posting_headers (company_id,supplier_id,header_ref,header_date,header_type,posting_ref,due_date)
       values
       ('$company_id','$supplier_id','$receipt_ref','$invoice_date','$header_type','$syspost_ref','$due_date')";

        //Execute the $sql query on the server to insert the values
          if ($conn->query($query) === TRUE) {
              $last_post_header_id =  $conn->insert_id;
              $post_header_id = $last_post_header_id;

              /* We have now switched to the details table, so we got the last insert id, we have set the variable
              $post header and now insert each purchased item */

              foreach ($_POST['lst_nominal_code'] as $row=>$id){
                $nominal_code = $_POST['hidden_nominal_code'][$row];
                 $quantity  = $_POST['txt_quantity_'][$row];
                  $item_cost = $_POST['txt_item_cost'][$row];
                   $line_total = $_POST['txt_line_total'][$row];
                    $description = $_POST['txt_description'][$row];
                     $trade_creditors = 2109;
                      $invoice_gross = $_POST['txt_gross'];
                       $vat_line = $_POST['txt_line_vat_'][$row];
                        $nominal_id = $id;
                          $subtotal = $_POST['txt_subtotal'];
                           $vat_total = $_POST['txt_vat_total'];
                            $vat_control = 2200;

           $query = ("INSERT INTO acc_posting_details 
           (post_header_id,nominal_acc_no,quantity,price,line_total,line_vat,vat_total,description,subtotal,debit,credit)
            VALUES 
            ('$post_header_id','$nominal_code','$quantity','$item_cost','$line_total','$vat_line','0','$description','$subtotal','$line_total','0'),
            ('$post_header_id','$vat_control','0','0','0','$vat_total','total VAT','vat content','0','$vat_total','0'),
            ('$post_header_id','$trade_creditors','0','0','0','0','0','trade Creditors','0','0','$invoice_gross')");

             if ($conn->query($query) === TRUE) {

          Header("Location:../add_purchase_invoice.php");



           } else {
   echo 'Error: '. $conn->error;
        }
          }
           }

              $conn->close();
              ?>

                  <?php 
                   // echo "<pre>";
                   // print_r($_POST);
                   // echo "<pre>";
                   //echo "vat control".$vat_control;
                    //echo "vat total is:".$vat_total

                  ?>

Solved, it was quiet easy really once I had a good look,by changing the order of the insert and removing from the "foreach" I achieved what I wanted with the following code. Thanks to all that helped.

 <?php session_start();?>
      <?php require_once('../Connections/connpay.php'); ?>
      <?php require_once('../functions/global_functions.php'); ?>
      <?php require_once('../functions/account_functions.php'); ?>

<?php 

        $supplier_id = clean_data($_POST['lst_supplier']);
        $receipt_ref = clean_data($_POST['txt_receipt_ref']);
        $invoice_date = clean_data($_POST['txt_receipt_date']);
        $due_date = clean_data ($_POST['txt_receipt_due']);
        $due_date = clean_data($_POST['txt_receipt_due']);
        $company_id = clean_data($_POST['hidden_company_id']);
        $syspost_ref = clean_data($_POST['txt_post_ref']);
        $header_type = "puchase_invoice";
        $nominal_id = clean_data($_POST['lst_nominal_code']);

    ?>

<?php 
  //Lets connect to the database
   if(mysqli_connect_errno()){
       exit("Failed to connect to the database".mysqli_connect_error());}
        //We first insert the header line of the purchase invoice, then we get the insert id and switch to the details table and insert 
         //the purchased items details

          $query ="INSERT INTO acc_posting_headers (company_id,supplier_id,header_ref,header_date,header_type,posting_ref,due_date)
          values
         ('$company_id','$supplier_id','$receipt_ref','$invoice_date','$header_type','$syspost_ref','$due_date')";

        //Execute the $sql query on the server to insert the values
          if ($conn->query($query) === TRUE) {

            // we now get the last insert id, and set it to a variable, we also declare the vat & gross amount variables
              $last_post_header_id =  $conn->insert_id;
              $post_header_id = $last_post_header_id;
              $vat_control = 2200;
              $vat_total = clean_data($_POST['txt_vat_total']);
              $trade_creditors = 2109;
              $invoice_gross = clean_data($_POST['txt_gross']);


               //We are now at the posting details table, we insert the trade creditors and total vat cr amounts first.
               $query = ("INSERT INTO acc_posting_details 
               (post_header_id, nominal_acc_no ,quantity,price,line_total,line_vat,vat_total,description,subtotal,debit,credit)
               VALUES 
               ('$post_header_id','$trade_creditors','0','0','0','0','0','trade Creditors','0','0','$invoice_gross'), 
               ('$post_header_id','$vat_control','0','0','0','$vat_total','0','vat content','0','$vat_total','0')");
                $conn->query($query);   

              // Now that we have inserted the two lines to show the trade creditors and vat CR and DR amounts we 
              //carry on and insert each invoice line from the posted array.
              foreach ($_POST['lst_nominal_code'] as $row=>$id){
              $nominal_code = $_POST['hidden_nominal_code'][$row];
              $quantity  = clean_data($_POST['txt_quantity_'][$row]);
              $item_cost = clean_data($_POST['txt_item_cost'][$row]);
              $line_total = clean_data($_POST['txt_line_total'][$row]);
              $description = clean_data($_POST['txt_description'][$row]);
              $vat_line = clean_data($_POST['txt_line_vat_'][$row]);
              $nominal_id = $id;
              $subtotal = clean_data($_POST['txt_subtotal']);


              $query = ("INSERT INTO acc_posting_details 
              (post_header_id, nominal_acc_no ,quantity,price,line_total,line_vat,vat_total,description,subtotal,debit,credit)
              VALUES 
             ('$post_header_id','$nominal_code','$quantity','$item_cost','$line_total','$vat_line','0','$description','0','$line_total','0')");


              // execute the insert query and push on to the purchase invoice page.
              if ($conn->query($query) === TRUE) {


              Header("Location:../add_purchase_invoice.php");



           } else {
   echo 'Error: '. $conn->error;
        }
          }
           }

              $conn->close();
              ?>

                  <?php 
                    //echo "<pre>";
                   // print_r($_POST);
                   // echo "<pre>";
                   ?>

It sounds like your core challenge is determining when you are in the last iteration of your foreach loop, so that you can then modify the query. Is that right?

You could use a counter to help. Something along these lines:

$i = 0;
$len = count($_POST['lst_nominal_code']);

foreach ($_POST['lst_nominal_code'] as $row=>$id) {
   // Assign (don't forget to sanitize!) all the POST variables
   <snip>

   if ($i == $len - 1) {
      // This is the last line! We want a different query, with $invoice_gross included
      $query = "...";
   } else {
      // This is NOT the last line, use the default query without $invoice_gross
      $query = "...";
   }

   $conn->query($query);

   $i++;
}

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