2015-10-17 64 views
0

我是新手,但我試圖將這件事情放在一起。更新表單根據所選行提交

我正在嘗試構建一個計費系統。在數據庫中,每張發票都有一個包含發票日期,截止日期等項目的PK。我有另一張表列出了兩個表中的發票ID之間的關係(itemID是PK)。我的問題是與物品表。

如果發票上只有一個項目,我可以更新記錄。但是,我的問題是,當我有多個條目時,我只能編輯該行中的最後一個條目。

下面是我的表看起來像一個例子。綠色箭頭表示項目列表中的最後一行(我可以更新);紅色箭頭表示我無法更新的行。 enter image description here

正如你所看到的,我能夠拿到個人ITEMID到一個變量旁顯示的形式提交按鈕:

     <td> 
         <input type="submit" name="submit_items" value="Submit" />' 
         .$row->item_id.' 
         </td> 

我想知道我將如何「連接」 /「副」單個項目的ID,所以它會運行相應的MySQL。例如,當我單擊itemID 4164的提交按鈕時,我正在查找MySQL查詢以更新itemID行4164.目前,我的代碼僅更新最後一個itemID。

下面是MySQL數據庫的查詢,它能夠更新最後一個項目:

 UPDATE o70vm_invoices_items SET 
       invoice_id = $invoiceID, 
       name = '$program', 
       `desc` ='$forWeek', 
       value = $value, 
       amount = $qty 

       WHERE id=$id 

我試圖改變WHERE語句來此:

   WHERE id=".$row->item_id."" 

但是,不顯示任何項目。我覺得我非常接近。一直工作了幾天。如果有辦法改變代碼以自動獲取表單提交按鈕所在位置的行ID,那麼我將是完成此項目的又一步。我自己似乎無法完成的一步。謝謝,如果有人在傾聽。 :)

有關如何處理此操作的任何建議,非常感謝。

這裏是我完整的代碼,萬一有很多問題我還沒有足夠的細節回答:

  $queryItems = "select 
     o.`id` as 'item_id', 
     o.`invoice_id` as 'invoice_id_on_items', 
     o.`name` as 'program', 
     o.`value` as 'fee', 
     o.`amount` as 'qty', 
     o.`desc` as 'forweek', 
     group_concat(o.`desc` separator ' & ') as 'forweekgroup',   
     round(sum((o.`value`) * (o.`amount`)),2) as 'inv-total' 
     from `o70vm_invoices_items` o 
     where o.`invoice_id` = $invoiceSelected 
     GROUP BY o.id"; 

    // storing the result of this MySQL query 
$resultItems = mysql_query($queryItems); 

echo' 

<form action="" method="post"> 
<div>'; 


echo "<h2>Invoice Items</h2>"; 

if($resultItems){ 
    echo ' 
     <table> 
      <tr> 
       <th scope="col">Invoice ID</th> 
       <th scope="col">Item ID</th> 
       <th scope="col">For Services Rendered</th> 
       <th scope="col">Program</th> 
       <th scope="col">Fee</th> 
       <th scope="col">Quantity</th> 
       <th scope="col">Total Fees</th> 
       <th scope="col">Edit</th> 

      </tr>'; 

    $id=0; /* Each field/element that has an id must have a unique id ~ use a counter to achieve this */ 

    $Invoice_Amount=0.00; 

    while($row = mysql_fetch_object($resultItems)){ 

     $id++;/* Increment the id counter */ 

     echo ' 
      <tr> 

       <td>'.$row->invoice_id_on_items.'</td> 

       <input type="hidden" title="'.$row->invoice_id_on_items.'" name="invoice_id" size="10" id="invoice_id" value="' . $row->invoice_id_on_items. '" /> 

       <td>'.$row->item_id.'</td> 

       <input type="hidden" title="'.$row->item_id.'" name="id" size="13" id="id" value="'.$row->item_id. '" /> 

       <td> 
        <input type="text" title="'.$row->forweek.'" name="desc" size="15" id="desc" value="' . $row->forweek. '" /> 
       </td> 
       <td> 
        <input type="text" title="'.$row->program.'" name="name" size="50" id="name" value="' . $row->program. '" /> 
       </td> 
       <td> 
        <input type="number" title="'.$row->fee.'" name="value" size="3" id="value" value="' . $row->fee. '" /> 
       </td> 
       <td> 
        <input type="number" title="'.$row->qty.'" name="amount" size="3" id="amount" value="' . $row->qty. '" /> 
       </td> 
       '; 
       $Fee = floatval($row->fee); 
       $Qty = floatval($row->qty); 
       $ItemFee=$Fee*$Qty; 
       echo ' 
       <td> 
        <input type="text" title="'.$ItemFee.'" name="total_fee" size="3" id="total_fee" value="' . $ItemFee. '" /> 
       </td> 


         <td> 
         <input type="submit" name="submit_items" value="Submit" />' 
         .$row->item_id.' 
         </td> 


        </tr>'; 



      $Invoice_Amount+=$ItemFee; 
    } 

    echo ' 
     <tr> 
     <td colspan=6></td>      
     <td>$'.$Invoice_Amount.'</td> 
     </tr></table> 

     </div> 
     </form>'; 
} else {/* Do not give away too much information and degrade gracefully */ 
    echo "We can't seem to pull the data information on this one, baby. Sorry. Code must be wrong."; 
    echo "Error:".mysql_error(); 
} 

      /* 
      EDIT RECORD START 
      */ 

      // get variables from the URL/form 
      $id = $_POST['id']; 
      $invoiceID = htmlentities($_POST['invoice_id'], ENT_QUOTES); 
      $program = htmlentities($_POST['name'], ENT_QUOTES); 
      $forWeek = htmlentities($_POST['desc'], ENT_QUOTES); 
      $value = htmlentities($_POST['value'], ENT_QUOTES); 
      $qty = htmlentities($_POST['amount'], ENT_QUOTES); 

      //NOTE: desc is a MySQL reserved word so we need to `desc` 
       $stmt = "UPDATE o70vm_invoices_items SET 
       invoice_id = $invoiceID, 
       name = '$program', 
       `desc` ='$forWeek', 
       value = $value, 
       amount = $qty 

       WHERE id=$id"; 
+0

你的代碼只更新了最後一排,因爲你的所有輸入字段爲每個錶行相同的名稱,因此他們互相覆蓋其他情況下,PHP從POST數據中提取它們。但即使你解決了這個問題,單擊一個提交按鈕仍然會提交整個表單,從而提供_all_行的數據。如果只想更新單個行,則應使用單獨的表單,每行一個。 (但是請記住,'form'元素只能放在'table'的周圍,或者放在HTML中的'td'中 - 你不能在表格行中放置它。) – CBroe

+0

謝謝。點擊一下就可以更新所有的行。關於如何讓每行在MySQL語句中有不同的變量的任何建議?我知道你可能沒有時間來編寫代碼,所以一兩個可以幫助我理解如何做到這一點的鏈接將會如此讚賞。 – kentrenholm

+1

您可以使用輸入字段名稱,例如'name =「id []」''''name =「desc []」'等 - 然後您將在您的PHP腳本中獲取數組值。 ('var_dump($ _ POST);'有助於理解你將得到的數據的確切結構。) – CBroe

回答

2

僞代碼來指導你更新你想,而不是一重擊的所有行的行。毫無疑問,還有很多其他方法...

while($row = mysql_fetch_object($resultItems)){ 
    /* 
     Copied quickly so if there are cells missing you should get the idea 
    */ 
    echo ' 
     <tr data-id="'.$row->item_id.'"> 
      <td>'.$row->invoice_id_on_items.'</td> 
      <td>'.$row->item_id.'</td> 
      <td><input type="text" title="'.$row->forweek.'" name="desc_'.$row->item_id.'" size="15" id="desc" value="' . $row->forweek. '" /></td> 
      <td><input type="text" title="'.$row->program.'" name="name_'.$row->item_id.'" size="50" id="name" value="' . $row->program. '" /></td> 
      <td><input type="number" title="'.$row->fee.'" name="value_'.$row->item_id.'" size="3" id="value_'.$row->item_id.'" value="' . $row->fee. '" /></td> 
      <td><input type="number" title="'.$row->qty.'" name="amount_'.$row->item_id.'" size="3" id="amount_'.$row->item_id.'" value="' . $row->qty. '" /></td> 
      <td> 
       <input type=\'button\' value=\'Submit\' /> 
       /* Notice it is now a simple button */ 
       <input type="hidden" title="'.$row->item_id.'" name="id_'.$row->item_id.'" size="13" id="id_'.$row->item_id.'" value="'.$row->item_id. '" /> 
       <input type="hidden" title="'.$row->invoice_id_on_items.'" name="invoice_id_'.$row->item_id.'" size="10" id="invoice_id_'.$row->item_id.'" value="' . $row->invoice_id_on_items. '" /> 
      </td> 
     </tr>'; 
} 

在頭部,類似如下: (這是未經測試,但這個想法是,它將通過Ajax請求發送的數據,做數據的〜也就是處理接收腳本:在表單動作)

<script> 

    function initialise(){/* establish listeners for button click events */ 
    var col=document.querySelectorAll('input[type="button"]'); 
    if(col)for(var n in col){ 
     if(col[n] && typeof(col[n]))=='object' && col[n].nodeType==1) col[n].addEventListener('click',processclicks,false); 
    } 
    } 


    function cbprocclick(r){ 
     alert(r); 
    } 


    function processclicks(event){/* Process the button click */ 
    var el=typeof(event.target)!='undefined' ? event.target : event.srcElement; 
    var parent=el.parentNode.parentNode; 
    var id=parent.dataset.id; 
    var callback=cbprocclick; 

    var col=parent.querySelectorAll('input'); 
    var fd=new FormData(); 

    for(var n in col) fd.append(n, col[n]); 

    /* Forgot the custom field for the ID */ 
    fd.append('record_id', id); 

    var request = new XMLHttpRequest(); 
    /* here you can setup a callback to handle messages sent back */ 
    if(request.status==200 && request.readystate==4){ 
     callback.call(this, request.responseText); /* etc */ 
    } 
    request.open("POST", "http://example.com/scriptname.php"); 
    request.send(fd); 
    } 

    document.addEventListener('DOMContentLoaded', initialise, false); 
</script> 

當數據被提交每個字段將具有追加到末尾記錄ID - 例如:desc_4等 JavaScript函數processclicks具有自定義字段(抱歉,忘了包括昨晚)叫做record_id whi ch是$row->item_id - 所以在接收端你應該能夠使用這個檢索記錄record_id

如果你發佈到同一頁面,我會建議處理實際數據輸入到db的代碼在頁面的頂部,然後像一個結構如下:

if($_SERVER['REQUEST_METHOD']=='POST'){ 
    if(isset($_POST['record_id'])){ 
      /* Make sure we discard any output ther emay have been to this point */ 
      @ob_clean(); 

     /* For debugging, try: */ 
     print_r($_POST); 
     /* Use the console to see what your request looks like and also the response */ 


     /* The record id sent as custom field */ 
     $recordid=$_POST['record_id']; 

     /* The records sent in the request */ 
     $description = htmlentities($_POST['desc_'.$recordid], ENT_QUOTES); 
     $invoiceid = htmlentities($_POST[ 'invoice_id_'.$record_id ], ENT_QUOTES); 
     $program = htmlentities($_POST[ 'name_'.$record_id ], ENT_QUOTES); 
     $fee = htmlentities($_POST[ 'value_'.$record_id ], ENT_QUOTES); 
     $qty = htmlentities($_POST[ 'amount_'.$record_id ], ENT_QUOTES); 


     /* Then construct your sql */ 
     $sql="update `o70vm_invoices_items` set 
        `invoice_id` = '$invoiceid', 
        `name` = '$program', 
        `desc` = '$description', 
        `value` = '$fee', 
        `amount` = '$qty' 
        where `id`='$recordid';";   


     /* 
      Because you are posting data via ajax 
      you only want to submit data, not load the 
      entire page again 
     */ 
     exit(); 
    } 
} 
+0

感謝RamRaider的幫助。由於我已經改變了輸入字段的名稱,以前的代碼來獲取我的變量不再有效[$ invoiceID = htmlentities($ _ POST ['invoice_id'],ENT_QUOTES);],任何想法如何我可以修改該部分?再次感謝。 – kentrenholm

+0

我做出的改變是否有意義? – RamRaider

+0

謝謝。但是,它仍然無法正常工作。如果有問題,我將發佈到同一頁面。我非常感謝你的幫助,但是我真的只是個新手,所以或許這已經過去了。 – kentrenholm