如何获取URL参数并解决数据库提案更新不匹配问题?
解决思路与代码修正
首先,你的核心问题出在validacao.php没有正确获取URL中的nproposta参数,反而直接查询了propostas表的第一条记录,所以不管你点击哪个提案的验证按钮,最终都会用第一条数据的编号去更新。另外还有一个严重问题:你的UPDATE语句没有加WHERE条件,会把所有提案的状态都改成Validado,这绝对不是你想要的结果。
下面是具体的修正步骤:
1. 正确获取URL中的nproposta参数
在validacao.php中,你需要通过$_GET超全局变量来获取URL里的nproposta值,同时做基本的校验确保参数存在且是数字:
// 先检查URL中是否存在nproposta参数,并且是有效的数字 if (!isset($_GET['nproposta']) || !is_numeric($_GET['nproposta'])) { die("无效的提案编号"); } // 转成整数类型,避免注入风险 $nproposta = intval($_GET['nproposta']);
2. 修改数据操作语句,添加WHERE条件
接下来,你需要给INSERT和UPDATE语句加上nproposta的匹配条件,确保只操作目标提案:
// 插入验证记录时,使用获取到的nproposta $insertValidacao = "INSERT INTO validacao (nproposta, nome_validacao, nif_validacao, email_validacao, preco_validacao) VALUES ($nproposta, '$nome_validacao', '$nif_validacao', '$email_validacao', '$preco_validacao')"; // 更新提案状态时,必须加WHERE条件,只更新指定nproposta的记录 $updateEstado = "UPDATE propostas SET validacao='Validado' WHERE nproposta = $nproposta"; // 执行语句(注意:这里先确保$nome_validacao等变量已经正确获取自表单提交) $resultado = mysqli_query($ligaBD, $insertValidacao); $resultado = mysqli_query($ligaBD, $updateEstado);
3. 重要安全提示(即使是测试环境)
你的当前代码存在严重的SQL注入风险,直接把用户输入的变量拼接到SQL语句里非常危险。哪怕是测试环境,也建议使用预处理语句来避免这个问题,示例如下:
// 预处理INSERT语句 $insertStmt = mysqli_prepare($ligaBD, "INSERT INTO validacao (nproposta, nome_validacao, nif_validacao, email_validacao, preco_validacao) VALUES (?, ?, ?, ?, ?)"); mysqli_stmt_bind_param($insertStmt, "issss", $nproposta, $nome_validacao, $nif_validacao, $email_validacao, $preco_validacao); mysqli_stmt_execute($insertStmt); // 预处理UPDATE语句 $updateStmt = mysqli_prepare($ligaBD, "UPDATE propostas SET validacao='Validado' WHERE nproposta = ?"); mysqli_stmt_bind_param($updateStmt, "i", $nproposta); mysqli_stmt_execute($updateStmt);
这样修改后,当你点击编号91的提案验证按钮时,validacao.php会正确获取到nproposta=91,然后只更新编号为91的提案记录,不会再影响其他提案了。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

