2013-04-03 23 views
0

我有一个发票表单将多行记录到插入页面以插入到多行中。我的绊脚石是当我插入多个订单时具有foreach语句的项目我也为每一行插入总额发票。我如何才能在插入的最后一行插入我所选列中的“发票总额”。在mysql中插入多行并限制其中一个行只能输入一次

我附上了我用来插入表单的代码,并且在提及之前,我已经清除了对数据清理函数的调用。


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

为什么斜塔的代码? – Kermit

+0

你有解决我的问题吗? – David

+0

如果我这样做了,我可能会在答案部分将它作为答案发布。 – Kermit

回答

0

这听起来像你的核心挑战,当你在你的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++; 
} 
+0

谢谢你,我认为你是在正确的轨道上,我会放弃并报告进度。非常感激。 – David

+0

嗨jszobody,今天早上我试了一下,但是没有给出我期待的结果。包含总额的行被输入两次,无论您发布多少订单行,只有两个正在插入。我会尝试分析发生的事情,如果我得到任何喜悦,请回报。 – David

+0

@David然后,你如何实现这一点有一些问题。请参阅:http://3v4l.org/8G8ir。使用计数器来确定循环的最后一次迭代的方法是合理的,并且运行良好。 – jszobody