[英]Updating Multiple SQL rows from HTML Table/Form with PHP
我有一个数据表,该数据表由4列图表组成,随着时间的流逝,这些图表需要更新,因此我想使用HTML表单来完成此操作,因此我在表格中添加了一些列,其中包含新值的输入(我也将它们添加到了数据库中),但是当我的表单在更新数据库中的任何字段时,我确实陷入了错误。
这是我的表格/表格:
<form method="post" action="test.php" id="price-increase">
<div class="x_panel">
<div class="x_content">
<table id="tablePrice" class="display table table-striped table-bordered dt-responsive">
<thead>
<tr>
<th>Item Code</th>
<th>Item Name</th>
<th>Brand Owner</th>
<th>Sales Group</th>
<th>Sales Sub Group</th>
<th>Current Net</th>
<th>Current Matrix</th>
<th>Current Band A</th>
<th>Customer Increase</th>
<th>New Invoice</th>
<th>New Net</th>
<th>New Matrix</th>
<th>New Band A</th>
<th>Incresed Date</th>
<th>Processed</th>
</tr>
</thead>
<tbody>
<?php while($res = sqlsrv_fetch_array($def, SQLSRV_FETCH_ASSOC)) : ?>
<tr>
<td>
<input type="text" name="ItemCode" id="ItemCode" class="form-control" value="<?php if(!empty($res['ItemCode'])){echo $res['ItemCode'];}?>" />
</td>
<td><?php echo $res['ItemName'];?></td>
<td><?php echo $res['BrandOwner'];?></td>
<td><?php echo $res['SalesGroup'];?></td>
<td><?php echo $res['SalesSubGroup'];?></td>
<td><?php echo $res['CurrentNet'];?></td>
<td><?php echo $res['CurrentMX'];?></td>
<td><?php echo $res['CurrentBandA'];?></td>
<td>
<input type="text" name="CustomerIncrease" id="CustomerIncrease" class="form-control" value="<?php if(!empty($res['CustomerIncrease'])){echo $res['CustomerIncrease'];}?>" />
</td>
<td>
<input type="text" name="NewInvoice" id="NewInvoice" class="form-control" value="<?php if(!empty($res['NewInvoice'])){echo $res['NewInvoice'];}?>" />
</td>
<td>
<input type="text" name="NewNet" id="NewNet" class="form-control" value="<?php if(!empty($res['NewNet'])){echo $res['NewNet'];}?>" />
</td>
<td>
<input type="text" name="NewMX" id="NewMX" class="form-control" value="<?php if(!empty($res['NewMX'])){echo $res['NewMX'];}?>">
</td>
<td><?php echo $res['NewBandA'];?>
<input type="text" name="NewBandA" id="NewBandA" class="form-control" value="<?php if(!empty($res['NewBandA'])){echo $res['NewBandA'];}?>" />
</td>
<td>
<input id="IncreaseDate" name="IncreaseDate" class="form-control " required="required" type="text" value="<?php if(!empty($res['IncreaseDate'])){echo $res['IncreaseDate'];}?>" />
</td>
<td><?php echo $res['Processed'];?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<button type="submit" id="submit" name="submit" class="btn btn-success pull-right" value="submit">Save</button>
</div>
</div>
这是我的PHP:
<?php
if(isset($_POST['submit'])){
$fields = array('ItemCode', 'CustomerIncrease','NewInvoice','NewNet','NewMX','NewBandA','IncreaseDate');
$params = array();
$setFields = array();
foreach($fields as $field) {
if (isset($_POST[$field]) && !empty($_POST[$field])) {
$params[] = $_POST[$field];
$setFields[] = $field.' = ?';
}
else {
$setFields[] = $field.' = NULL';
}
}
$query = " UPDATE po_SupplierPriceIncrease
SET '.implode(', ',$setFields).'
WHERE ItemCode = ?";
$stmt = sqlsrv_prepare($sapconn2, $query, $params);
sqlsrv_execute($stmt);
}
?>
当我单击提交时,没有任何反应。 有任何想法吗?
您的代码有些错误。 首先,在HTML中,由于要回显几行,因此要回显表单字段的多个实例,因此需要对input
s进行一些更改。 例如:
<input type="text" name="ItemCode[]" class="..." />
这里发生的是我在输入名称中添加了方括号[]
。 这意味着,如果存在多个具有相同名称的输入形式(在这种情况下,是因为每个输入对每一行都是“重复的”),那么它将在发布数据中创建这些值的数组。 我还删除了id
属性,因为ID应该是唯一的。
在PHP中,存在一些问题。
第一个问题是, $params
数组中的值比$query
占位符( ?
)少。 $params
包含要更改其值的所有字段的值,但是您忘记为查询的WHERE
子句添加值。 然后这导致问题二...
您不会在表单中传递任何对旧ItemCode
引用。 例如,如果我在表中有一行ID为123ABC
的行,并且想将其更改为456DEF
,则使用帖子数据中当前可用的唯一ItemCode,用PHP生成的查询将类似于:
UPDATE po_SupplierPriceIncrease SET ItemCode = '456DEF', [...] WHERE ItemCode = '456DEF'
如果当前没有ID为456DEF
的行,则不会更新任何内容。 或更糟糕的是,如果ID为456DEF
,它将覆盖该数据。
问题三...您只执行一次查询。 如果要对每一行执行更新查询,则需要将其置于循环中。
为了解决这些问题,我将执行以下操作:
首先,要解决问题二,我将向每行添加一个隐藏的输入字段,其中包含当前的ItemCode
以便在更新数据库中的行时用作参考。
<td>
<input type="hidden" name="curItemCode[]" value="<?php echo $res['ItemCode']; ?>" />
<input type="text" name="ItemCode[]" id="ItemCode" class="form-control" value="<?php if(!empty($res['ItemCode'])){echo $res['ItemCode'];}?>" />
</td>
为了解决问题一和问题三,我会这样做。
if (isset($_POST['submit'])) {
$fields = ["CustomerIncrease", "NewInvoice", "NewNet", "NewMX", "NewBandA", "IncreaseDate"];
foreach ($_POST['curItemCode'] as $k => $val) {
$params = [];
$setFields = [];
foreach ($fields as $field) {
if (isset($_POST[$field][$k]) && !empty($_POST[$field][$k])) {
$params[] = $_POST[$field][$k];
$setFields[$field] = $_POST[$field][$k];
} else {
$setFields[$field] = null;
}
}
$params[] = $val;
$query = "UPDATE po_SupplierPriceIncrease SET " . getSetFields($setFields) . " WHERE ItemCode = ?";
$stmt = sqlsrv_prepare($sapconn2, $query, $params);
if (sqlsrv_execute($stmt) === false) {
die(print_r(sqlsrv_errors(), true));
}
}
}
function getSetFields($fields) {
$s = "";
foreach ($fields as $field => $value) {
if(!is_null($value)){
$s .= ($field !== "IncreaseDate") ? "$field = CAST(? as numeric(9,2))," : "$field = ?,";
} else {
$s .= "$field = NULL,";
}
}
return rtrim($s, ",");
}
从理论上讲,上面的方法应该可以工作,尽管我无法对其进行正确的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.