使用PHP从HTML表/表单更新多个SQL行

时间:2016-12-13 10:03:24

标签: php html sql sql-server-2008 html-form-post

我有一个数据表,其中包含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);
}
?>

当我点击提交时,没有任何反应。任何想法?

1 个答案:

答案 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, ",");
}

从理论上讲,上面的应该有效,但我还是无法正确测试。