简体   繁体   English

根据所选行更新表单提交

[英]Update form submit depending on selected row

I am a novice but I am trying to pull this thing together. 我是新手,但我正在尝试将其组合在一起。

I am trying to build a billing system. 我正在尝试建立一个计费系统。 Within the DB, each invoice has a PK with items such as invoice date, due date, etc. I have another table that lists the items (itemID is the PK) with a relationship between a Invoice ID in both tables. 在数据库中,每个发票都有一个包含诸如发票日期,到期日等项目的PK。我还有另一个表,列出了这些项目(itemID为PK),两个表中的发票ID之间都有关系。 My issue is with the Items table. 我的问题是项目表。

In cases where only one item is on the invoice, I can update records. 如果发票上只有一项,我可以更新记录。 However, my problem is when I have more than one entry, I can only edit the last entry in the row. 但是,我的问题是,当我有多个条目时,我只能编辑该行中的最后一个条目。

Here is a illustration of what my table looks like. 这是我的桌子的示意图。 The Green arrow indicates the last row in the items list (which I can update); 绿色箭头表示项目列表中的最后一行(我可以更新); the red arrow indicates the row I cannot update. 红色箭头表示我无法更新的行。 在此处输入图片说明

As you can see, I am able to get the individual itemID into a variable to display alongside the form submit button: 如您所见,我能够将单个itemID放入一个变量中,以与表单提交按钮一起显示:

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

I am wondering how would I "link" / "associate" the individual item id so it will run the corresponding MySQL. 我想知道如何“链接” /“关联”单个项目ID,以便它将运行相应的MySQL。 For example, I'm looking for the MySQL query to update itemID row 4164 when I click the submit button for itemID 4164. Currently, my code is only updating the last itemID. 例如,当我单击itemID 4164的提交按钮时,我正在寻找MySQL查询来更新itemID行4164。当前,我的代码仅更新最后一个itemID。

Here is the MySQL query which is able to update the final item: 这是能够更新最终项目的MySQL查询:

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

                WHERE id=$id

I have tried to change the WHERE statement to this: 我试图将WHERE语句更改为此:

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

However, no item is displayed. 但是,没有显示任何项目。 I think I am pretty close. 我想我很近。 Been working at it for a the few days. 已经工作了几天。 If there is a way to alter the code to automatically get the row ID of where the form submit button is located, I will be a major step closer to completing this project. 如果有一种方法可以更改代码以自动获取表单提交按钮所在的行ID,那么我将比完成此项目迈出重要的一步。 A step I can't seem to do by myself. 我似乎无法独自完成这一步骤。 Thanks if anyone is listening. 谢谢,如果有人在听。 :) :)

Any suggestions on how to handle this operation, so much appreciated. 关于如何处理此操作的任何建议,非常感谢。

Here is my complete code, in case there are many questions I have not answered with enough detail: 这是我完整的代码,以防万一有很多问题我没有足够详细地回答:

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

Pseudo code to guide you in updating the row you want rather than all rows in one hit. 伪代码可指导您更新所需的行,而不是一次命中所有行。 No doubt there are lots of other methods too... 毫无疑问,还有许多其他方法...

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>';
}

In the head section, something like the following: ( this is untested but the idea is that it will send the data via ajax request to the receiving script that does the processing of the data ~ ie: the form action ) 在开头部分,类似以下内容:(这未经测试,但是其想法是它将通过ajax请求将数据发送到执行数据处理的接收脚本,即form动作)

<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>

When data is submitted each of the fields will have the record ID appended to the end - example: desc_4 etc The javascript function processclicks has a custom field ( sorry, forgot to include that yesterday evening ) called record_id which is the $row->item_id - so at the receiving end you should be able to retrieve the records using this record_id 当数据被提交每个字段将具有追加到末尾记录ID -例如: desc_4等JavaScript函数processclicks具有自定义字段(抱歉,忘了包括昨天晚上)称为record_id它是$row->item_id -因此在接收端,您应该能够使用此record_id检索记录

If you are posting to the same page, I'd suggest that the code that handles the actual data entry to the db is at the top of the page and then a structure like the following: 如果要发布到同一页面,则建议将处理实际数据输入到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();
    }
}

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

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