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

PHP表单无法获取输入、删除查询失效问题求助

问题排查与修复方案

我帮你梳理了代码里的几个关键问题,这就是为啥你的输入验证和删除功能都失效的原因,下面是具体的问题点和修复方法:

1. 运算符用错了(赋值代替了比较)

你在判断错误信息是否为空的时候,写的是if ($product_name_err ='')——这里用了赋值运算符=,而不是用来比较的==或者===。这会直接把空字符串塞给$product_name_err,导致两个大问题:

  • 就算用户没输入内容,原本的错误提示也会被清空,用户根本看不到“请输入产品名”的提示
  • 不管输入合不合法,代码都会执行删除查询(哪怕$product_name是空的,这时候会删掉所有name为空的记录,逻辑完全错误)

修复方法很简单,改成比较运算符就行:

if ($product_name_err === ''){
    // 这里执行删除操作
}

2. 输入框没回显用户输入的内容

当前的输入框没有设置value属性,用户提交表单后如果有错误,之前输入的内容就没了,体验特别差。得加上回显,还要用htmlspecialchars转义特殊字符防止XSS攻击:

<input type="text" name="product_name" class="form-control" value="<?php echo htmlspecialchars($product_name); ?>">

3. 存在严重的SQL注入风险

直接把用户输入的$product_name拼进SQL语句里是超级危险的,恶意用户随便输入点SQL代码就能搞坏你的数据库。必须用预处理语句来解决这个问题,同时还能保证查询的安全性:

替换原来的删除代码段:

if ($product_name_err === ''){
    // 使用预处理语句,用?作为占位符
    $sql = "DELETE FROM `products` WHERE `name` = ?";
    if($stmt = mysqli_prepare($link, $sql)){
        // 绑定参数,"s"表示参数是字符串类型
        mysqli_stmt_bind_param($stmt, "s", $param_product_name);
        $param_product_name = $product_name;
        
        // 执行语句并给出反馈
        if(mysqli_stmt_execute($stmt)){
            echo "<div class='alert alert-success'>删除成功!共删除 " . mysqli_stmt_affected_rows($stmt) . " 条记录。</div>";
            // 清空输入框的值
            $product_name = '';
        } else{
            echo "<div class='alert alert-danger'>删除失败,请重试。</div>";
        }
        // 记得关闭预处理语句
        mysqli_stmt_close($stmt);
    }
}

4. 缺少用户反馈

原来的代码执行删除后啥提示都没有,用户根本不知道操作成功还是失败。上面的修复代码里加了成功和失败的提示,用户体验会好很多。

整合后的完整代码

把所有修改整合之后,代码应该是这样的:

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 3/24/2019
 * Time: 4:38 PM
 */

// Include config file
require_once "config.php";

$product_name= '';
$product_name_err = '';

// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST") {
    if(empty(trim($_POST["product_name"]))){
        $product_name_err = "Please enter the product name.";
    } else{
        $product_name = trim($_POST["product_name"]);
    }

    //Delete the data in the product table
    if ($product_name_err === ''){
        $sql = "DELETE FROM `products` WHERE `name` = ?";
        if($stmt = mysqli_prepare($link, $sql)){
            mysqli_stmt_bind_param($stmt, "s", $param_product_name);
            $param_product_name = $product_name;
            
            if(mysqli_stmt_execute($stmt)){
                echo "<div class='alert alert-success'>删除成功!共删除 " . mysqli_stmt_affected_rows($stmt) . " 条记录。</div>";
                $product_name = '';
            } else{
                echo "<div class='alert alert-danger'>删除失败,请重试。</div>";
            }
            mysqli_stmt_close($stmt);
        }
    }
}
?>
<?php include "header_admin.php"?>
<div class="wrapper">
    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
        <div class="form-group <?php echo (!empty($product_name_err)) ? 'has-error' : '';?>">
            <label>Product name</label>
            <input type="text" name="product_name" class="form-control" value="<?php echo htmlspecialchars($product_name); ?>">
            <span class="help-block"><?php echo $product_name_err; ?></span>
        </div>
        <div class="form-group">
            <input type="submit" class="btn btn-primary" value="Delete Item">
        </div>
    </form>
</div>
<?php include "footer.php"?>

额外小建议

  • 执行删除前最好加个确认弹窗(比如用JS的confirm),防止用户误删重要数据
  • 确保只有授权的管理员能访问这个页面,避免恶意删除
  • 可以加个删除日志,记录谁什么时候删了什么产品,方便后续排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:14:30