简体   繁体   English

在mysql中插入多行并限制其中一行只能输入一次

[英]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. 我有一个发票表格,该表格将多行发布到插入页面以插入多行。我的绊脚石是,当我用foreach语句插入多个订单商品时,我还要为每行插入发票总额。 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. 解决了,一旦我有了好看,这真的很容易实现,通过更改插入顺序并从“ foreach”中删除,我用以下代码实现了我想要的。 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. 听起来您的核心挑战是确定何时进入foreach循环的最后一次迭代,以便随后可以修改查询。 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++;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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