繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM