我是新手,但我想把这个东西拉到一起。
我正在尝试建立一个结算系统。在数据库中,每张发票都有一个PK,其中包含发票日期,截止日期等项目。我有另一个表格列出项目(itemID是PK),两个表格中的发票ID之间存在关系。我的问题在于Items表。
如果发票上只有一个项目,我可以更新记录。但是,我的问题是,当我有多个条目时,我只能编辑该行中的最后一个条目。
以下是我的表格的示意图。绿色箭头表示项目列表中的最后一行(我可以更新);红色箭头表示我无法更新的行。
如您所见,我可以将单个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";
答案 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();
}
}