根据所选行

时间:2015-10-17 22:38:40

标签: php mysql forms

我是新手,但我想把这个东西拉到一起。

我正在尝试建立一个结算系统。在数据库中,每张发票都有一个PK,其中包含发票日期,截止日期等项目。我有另一个表格列出项目(itemID是PK),两个表格中的发票ID之间存在关系。我的问题在于Items表。

如果发票上只有一个项目,我可以更新记录。但是,我的问题是,当我有多个条目时,我只能编辑该行中的最后一个条目。

以下是我的表格的示意图。绿色箭头表示项目列表中的最后一行(我可以更新);红色箭头表示我无法更新的行。 enter image description here

如您所见,我可以将单个itemID放入变量中,以便在表单提交按钮旁边显示:

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

我想知道我将如何&#34;链接&#34; /&#34;员工&#34;单个项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";

1 个答案:

答案 0 :(得分: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的自定义字段(抱歉,忘了包含昨天晚上)$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();
    }
}