这是一个简单的问题。我正在开发一个与客户和供应商相关的PHP项目。当我从数据库中选择customerid
时,该客户的未付帐单会自动填入表格中,因此该表格包含支票,帐单编号,帐单金额,付款金额和“删除”列。
此删除链接将删除该行,以便我只需支付一些账单。 (如果我有5张未付账单,我可以删除3张账单并输入其他2张账单的数据)。在这里,我想将billno
和billamount
显示为标签,将付款金额显示为输入金额的文本框。我需要将billno
发布到服务器,因为我可能会删除一些行。但PHP的$_POST
无法识别标签。我尝试使用td
id(表格单元格ID)和输入类型“隐藏”,但这不起作用。你能建议一种方法吗?
这是我的代码:
表格代码:
<TABLE id="mytable1">
<tr>
<th>Select</th>
<th>Bill No</th>
<th>Bill Amount</th>
<th>Received Amount</th>
<th>Remove</th>
</tr>
<TR>
<td ><INPUT type="checkbox" name="chk[]" ></td>
<td ><label id="labelidinv"></label><input type="hidden" name="invhide[]" value="12" ></td>
<TD><label id="labelidinvamt"></label> </TD>
<TD><input name="receivedamt[]" type="text" size="6" id="receivedamt" ></TD>
<td> <a href="#" onClick="deleteRowReceipt('mytable1')">Remove </a> </td>
</TR>
</table>
Ajax代码:
var inv_id = xmlDoc.getElementsByTagName("inv_id");
var inv_amt = xmlDoc.getElementsByTagName("inv_amt");
var count = xmlDoc.getElementsByTagName("count");
var inv_id_desc = inv_id[0].firstChild.nodeValue;
var inv_amt_desc = inv_amt[0].firstChild.nodeValue;
var countdesc = count[0].firstChild.nodeValue;
document.getElementById('labelidinv').innerHTML =inv_id_desc;
document.getElementById('labelidinvamt').innerHTML=inv_amt_desc;
var table = document.getElementById('mytable1');
for(var j=1;j<countdesc;j++)
{
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
var colCount = table.rows[0].cells.length;
for(var i=0; i<colCount; i++)
{
var newcell = row.insertCell(i);
newcell.innerHTML = table.rows[1].cells[i].innerHTML;
if(i==1)
newcell.innerHTML = inv_id[j].firstChild.nodeValue;
if(i==2)
newcell.innerHTML= inv_amt[j].firstChild.nodeValue;
}
}
此处我无法发布标签ID值。有没有办法这样做?我想要标签中的只读值,我需要将它们发回服务器。提前致谢。
编辑
我发送像这样的ajax请求
var custname = document.getElementById('customer').options[document.getElementById('customer').selectedIndex].value;
xmlhttp.open("POST","../MODEL/AjaxRequestHandler.php?action=custdetails&CUST_NAME="+custname,true)
在AjaxRequestHandler页面:
$CUST_NAME = $_GET['CUST_NAME'];
$querry1 = "select * from RECEIVABLES where CUSTOMER_NAME = $cust_name and FULL_PART_PAID !='F' and voucher_type='SI' ";
/*full_part_paid column is whether that bill fully paid or not, and voucher type = "Sales invoice"*/
$res1 = odbc_exec($conn,$querry1);
$i = 0;
echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
echo '<XmlResponse>'. "\n";
while(odbc_fetch_row($res1))
{
$inv_id= odbc_result($res1, "invoice_id");
echo '<inv_id>'.$inv_id.'</inv_id>'. "\n";
$inv_amt = odbc_result($res1,"invoice_amount");
echo '<inv_amt>'.$inv_amt.'</inv_amt>'. "\n";
$i++;
}
echo '<count>'.$i.'</count>'."\n";
echo '</XmlResponse>'. "\n";
答案 0 :(得分:2)
如果我理解你想要做什么,那么这是我的建议:
更改
<input name="receivedamt[]" type="text" size="6" id="receivedamt">
为:
<input name="receivedamt_<?= $row['id'] ?>" type="text" size="6" id="receivedamt_<?= $row['id'] ?>">
其中$row['id']
是此数据库行的实际ID。这样,当postdata进入时,您将能够知道支付的行如下:
<?php
foreach($_POST as $key => $value) {
$key_parts = explode('_',$key);
if($key_parts[0] == 'receivedamt' && !empty($value) {
$id = intval($key_parts[1]);
$amt = doubleval($value);
mysql_query("UPDATE `some_table` SET `receivedamt`=$amt WHERE `id`=$id");
}
}
这样,您甚至不必担心复选框或删除行。只需将您不想支付的任何款项留空,服务器就不会更新它们。或者,如果您愿意,可以从DOM中删除行,服务器仍然不会更新它们,因为它们不会在$_POST
中发送。
这有意义吗?
答案 1 :(得分:1)
解决这个问题的一种方法是不删除付费账单的行,这无论如何都是不好的做法。为什么要删除已支付账单的记录...如果出现问题并且您需要确认过去的付款怎么办?相反,我会在表中为“付费”添加一列,并在付款时将值从0更改为1。然后,您不必将标签发送回服务器,只需提取“付费”值为0的帐单数据,以便在付费网站上显示。