繁体   English   中英

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

暂无
暂无

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

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