You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP CRUD应用更新功能失效问题求助

修复CRUD应用更新模块异常问题

核心问题及修复方案

  1. 缺失POST请求中的ID参数
    在POST处理分支中,代码未从表单提交的隐藏字段获取id值,导致UPDATE语句的WHERE id = '$id'中$id为空,无法定位到要更新的记录。需添加:

    $id = $_POST["id"];
    

    到POST逻辑的开头。

  2. 下拉选择框未预填充原有数据
    pcs和warr下拉框没有根据数据库中的值设置选中状态,会导致用户提交时可能覆盖原有数据为空白。修改下拉框代码,添加条件判断设置selected属性:
    例如pcs下拉框:

    <select name="pcs" id="">
        <option value="" <?php echo empty($pcs) ? 'selected="selected"' : ''; ?>></option>
        <option value="1" <?php echo $pcs == '1' ? 'selected="selected"' : ''; ?>>1</option>
        <!-- 其他选项同理 -->
    </select>
    

    warr下拉框:

    <select name="warr" id="">
        <option value="" <?php echo empty($warr) ? 'selected="selected"' : ''; ?>></option>
        <option value="yes" <?php echo $warr == 'yes' ? 'selected="selected"' : ''; ?>>Yes</option>
        <option value="no" <?php echo $warr == 'no' ? 'selected="selected"' : ''; ?>>No</option>
    </select>
    
  3. SQL注入风险及安全优化
    直接将用户输入拼接到SQL语句存在安全漏洞,应使用预处理语句代替:

    $sql = "UPDATE replog 
            SET service_dept = ?, po = ?, customer = ?, pcs = ?, equipment = ?, date_rec = ?, problem = ?, warr = ?, date_ship = ? 
            WHERE id = ?";
    $stmt = $connection->prepare($sql);
    $stmt->bind_param("sssssssssi", $service_dept, $po, $customer, $pcs, $equipment, $date_rec, $problem, $warr, $date_ship, $id);
    $result = $stmt->execute();
    

    这样可以避免SQL注入,同时处理特殊字符的转义问题。

  4. 检测更新是否实际生效
    添加对受影响行数的检查,确保确实有记录被更新:

    if (!$result) {
        $errorMessage = "Invalid Query: " . $connection->error;
        break;
    }
    if ($connection->affected_rows == 0) {
        $errorMessage = "No record found with this ID or no changes made";
        break;
    }
    

完整修正后的代码

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database= "replog_test";

//create connection
$connection = new mysqli($servername, $username, $password, $database);

$id = "";
$service_dept="";
$po="";
$customer="";
$pcs="";
$equipment="";
$date_rec="";
$problem="";
$warr="";
$date_ship="";

$errorMessage = "";
$successMessage = "";

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    //GET method: Show the data of the client

    if (!isset($_GET["id"])) {
        header("location: /novasvm/index.php");
        exit;
    }

    $id = $_GET["id"];

    // read the row of the selected client from the database table
    $sql = "SELECT * FROM replog WHERE id=?";
    $stmt = $connection->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();

    if (!$row) {
        header("location: /novasvm/index.php");
        exit;
    }

    $service_dept = $row["service_dept"];
    $po = $row["po"];
    $customer = $row["customer"];
    $pcs = $row["pcs"];
    $equipment = $row["equipment"];
    $date_rec = $row["date_rec"];
    $problem = $row["problem"];
    $warr = $row["warr"];
    $date_ship = $row["date_ship"];
}
else {
    // POST method: Update the data of the client
    $id = $_POST["id"]; // 新增获取ID
    $service_dept = $_POST["service_dept"];
    $po = $_POST["po"];
    $customer = $_POST["customer"];
    $pcs = $_POST["pcs"];
    $equipment = $_POST["equipment"];
    $date_rec = $_POST["date_rec"];
    $problem = $_POST["problem"];
    $warr = $_POST["warr"];
    $date_ship = $_POST["date_ship"];

    do {
        if ( empty($service_dept) || empty($po) || empty($customer) || empty($pcs) || empty($equipment) || empty($date_rec) || empty($problem) || empty($warr)) {
            $errorMessage = "All fields except DATE SHIPPED are required";
            break;
        }

        // 使用预处理语句避免SQL注入
        $sql = "UPDATE replog 
                SET service_dept = ?, po = ?, customer = ?, pcs = ?, equipment = ?, date_rec = ?, problem = ?, warr = ?, date_ship = ? 
                WHERE id = ?";
        $stmt = $connection->prepare($sql);
        $stmt->bind_param("sssssssssi", $service_dept, $po, $customer, $pcs, $equipment, $date_rec, $problem, $warr, $date_ship, $id);
        $result = $stmt->execute();
        
        if (!$result) {
            $errorMessage = "Invalid Query: " . $connection->error;
            break;
        }

        // 检查是否有行被更新
        if ($connection->affected_rows == 0) {
            $errorMessage = "No record updated - either ID doesn't exist or no changes were made";
            break;
        }

        $successMessage = "Client Updated Correctly";
        header("location: /novasvm/general/replog.php");
        exit;

    } while(false);
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../style.css" type="text/css">
    <link rel="stylesheet" href="../reset.css" type="text/css">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
    <title>Repair Log</title>
</head>
<body>
    <div>
        <h2>New Data</h2>

        <?php  
        if ( !empty($errorMessage)) {
            echo "
            <div>
                <strong>$errorMessage</strong>
            </div>
            ";
        }          
        ?>

        <form method="post">
            <input type="hidden" name="id" value="<?php echo $id; ?>">
            <div>
                <label>Service Department</label>
                <div>
                    <input type="text" name="service_dept" value="<?php echo $service_dept; ?>">
                </div>
            </div>
            <div>
                <label>PO Number</label>
                <div>
                    <input type="text" name="po" value="<?php echo $po; ?>">
                </div>
            </div>
            <div>
                <label>Customer</label>
                <div>
                    <input type="text" name="customer" value="<?php echo $customer; ?>">
                </div>
            </div>
            <div>
                <label>Pieces</label>
                <div>
                    <select name="pcs" id="">
                        <option value="" <?php echo empty($pcs) ? 'selected="selected"' : ''; ?>></option>
                        <option value="1" <?php echo $pcs == '1' ? 'selected="selected"' : ''; ?>>1</option>
                        <option value="2" <?php echo $pcs == '2' ? 'selected="selected"' : ''; ?>>2</option>
                        <option value="3" <?php echo $pcs == '3' ? 'selected="selected"' : ''; ?>>3</option>
                        <option value="4" <?php echo $pcs == '4' ? 'selected="selected"' : ''; ?>>4</option>
                        <option value="5" <?php echo $pcs == '5' ? 'selected="selected"' : ''; ?>>5</option>
                        <option value="6" <?php echo $pcs == '6' ? 'selected="selected"' : ''; ?>>6</option>
                        <option value="7" <?php echo $pcs == '7' ? 'selected="selected"' : ''; ?>>7</option>
                        <option value="8" <?php echo $pcs == '8' ? 'selected="selected"' : ''; ?>>8</option>
                        <option value="9" <?php echo $pcs == '9' ? 'selected="selected"' : ''; ?>>9</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Equipment</label>
                <div>
                    <input type="text" name="equipment" value="<?php echo $equipment; ?>">
                </div>
            </div>
            <div>
                <label>Date Received</label>
                <div>
                    <input type="date" name="date_rec" value="<?php echo $date_rec; ?>">
                </div>
            </div>
            <div>
                <label>Problem / Serial No.</label>
                <div>
                    <input type="text" name="problem" value="<?php echo $problem; ?>">
                </div>
            </div>
            <div>
                <label>Warranty</label>
                <div>
                    <select name="warr" id="">
                        <option value="" <?php echo empty($warr) ? 'selected="selected"' : ''; ?>></option>
                        <option value="yes" <?php echo $warr == 'yes' ? 'selected="selected"' : ''; ?>>Yes</option>
                        <option value="no" <?php echo $warr == 'no' ? 'selected="selected"' : ''; ?>>No</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Date Shipped</label>
                <div>
                    <input type="date" name="date_ship" value="<?php echo $date_ship; ?>">
                </div>
            </div>

            <?php
            if (!empty($successMessage)) {
                echo "
                <div>
                    <strong>$successMessage</strong>
                </div>
                ";
            }
            ?>

            <div>
                <button type="submit">Submit</button>
            </div>
            <div>
                <a href="/novasvm/general/replog.php" role="button">Cancel</a>
            </div>
        </form>
    </div>
</body>
</html>

额外说明

  • 预处理语句不仅提升了安全性,还能自动处理字符串中的特殊字符(如单引号),避免因输入内容导致SQL语法错误。
  • 检查受影响行数可以帮助你排查ID不存在或无修改内容的情况,给用户更准确的反馈。

内容的提问来源于stack exchange,提问作者Jakkber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:27:01