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


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

我有一个发票表单,它将多行发送到插入页面,以便插入到多行。我遇到的障碍是,当我用foreach语句插入多个订单项时,我还插入了每行的发票总额。例如,我如何在我选择的一列的插入的最后一行插入"发票总额"呢?

我已经包含了用于插入表单的代码,在提到它之前,为了清晰起见,我已经剥离了对数据清理函数的调用。


<?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
                  ?>
解决了

,一旦我有一个很好的看,它是非常容易的,通过改变插入的顺序和从"foreach"中删除,我实现了我想要的下面的代码。感谢所有的帮助。

 <?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>";
                   ?>

听起来您的核心挑战是确定何时处于foreach循环的最后一次迭代,以便可以修改查询。对吗?

你可以使用计数器来帮助。下面的内容:

$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++;
}