我有一个数据表,其中包含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);
}
?>
当我点击提交时,没有任何反应。任何想法?
答案 0 :(得分:3)
您的代码存在一些问题。首先在HTML中,当您回显几行并因此回显表单字段的多个实例时,您需要对input
进行一些更改;例如:
<input type="text" name="ItemCode[]" class="..." />
这里发生的事情是我在输入名称中添加了方括号[]
。这意味着如果表单中有多个相同名称的输入(在这种情况下,因为每个输入对于每一行都是“重复”),那么它会在后期数据中创建这些值的数组。我还删除了id
属性,因为ID应该是唯一的。
在PHP中,存在一些问题。
问题一,您的$params
数组中的值比?
中的占位符($query
)少。 $params
包含您要更改其值的所有字段的值,但您忘记添加查询的WHERE
子句的值。这导致问题二......
您不会将表单中的任何引用传递给旧版ItemCode
。例如,如果我在表中有一行id为123ABC
并且我想将其更改为456DEF
,使用post数据中当前可用的唯一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, ",");
}
从理论上讲,上面的应该有效,但我还是无法正确测试。