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
相关产品推荐
相关产品推荐

