PHP表单无法插入数据库数据排查(疑与单选按钮Preke相关)
无法向数据库插入数据的问题排查与修复
我仔细梳理了你的代码,发现几个核心问题导致数据无法插入数据库,其中包含你怀疑的单选按钮相关逻辑,还有其他关键漏洞,下面逐一说明并给出修复方案:
1. 未完成的test_input数据处理函数
你的test_input函数最后一行代码不完整,只写了htmlspecialc,正确应该是htmlspecialchars($data);。这个函数负责清洗用户输入,不完整会导致脚本报错,直接中断后续逻辑。
2. 单选按钮验证逻辑位置错误
你把单选按钮的验证代码放在了$_SERVER["REQUEST_METHOD"] == "POST"的判断外部!当页面首次加载(非POST请求)时,$_POST["Preke"]根本不存在,会直接触发错误提示,而且这部分验证完全脱离了表单提交的上下文。正确的做法是所有表单验证逻辑都要包裹在POST请求的判断块内。
3. 缺失数据库插入的核心代码
你只实现了表单验证逻辑,但完全没有编写连接数据库、执行插入语句的代码——没有实际执行插入操作,数据当然不会被写入数据库。
4. 变量赋值的低级错误
- 你把
Pk字段的错误提示赋值给了$Pk变量:$Pk = "Įveskite prekės kodą";,正确应该是赋值给$PkErr,否则会把错误文本当成字段值传入数据库。 - 数字类型字段(
Pk、Kiekis)仅验证非空不够,还需要验证是否为有效数字,避免插入非法内容。
修复后的完整代码示例
<!DOCTYPE HTML> <?php // 定义变量并初始化为空值 $VarErr = $PavErr = $AdErr = $PreErr = $PkErr = $KiekErr = ""; $Vardas = $Pavarde = $Adresas = $Preke = $Pk = $Kiekis = ""; // 数据清洗函数 function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } // 表单提交处理逻辑 if ($_SERVER["REQUEST_METHOD"] == "POST") { // 验证Vardas if (empty($_POST["Vardas"])) { $VarErr = "Įveskite vardą"; } else { $Vardas= test_input($_POST["Vardas"]); if (!preg_match("/^[a-zA-Z ]*$",$Vardas)) { $VarErr = "Galima vesti tik su raidėmis"; } } // 验证Pavarde if (empty($_POST["Pavarde"])) { $PavErr = "Įveskite pavardę"; } else { $Pavarde = test_input($_POST["Pavarde"]); if (!preg_match("/^[a-zA-Z ]*$",$Pavarde)) { $PavErr = "Galima vesti tik su raidėmis"; } } // 验证Adresas if (empty($_POST["Adresas"])) { $AdErr = "Įveskite adresą"; } else { $Adresas= test_input($_POST["Adresas"]); } // 验证Preke(单选按钮) if (empty($_POST["Preke"])) { $PreErr = "Pasirinkite prekės tipą"; } else { $Preke = test_input($_POST["Preke"]); } // 验证Pk(数字验证) if (empty($_POST["Pk"])) { $PkErr = "Įveskite prekės kodą"; } else { $Pk = test_input($_POST["Pk"]); if (!is_numeric($Pk)) { $PkErr = "Prekės kodas turi būti skaičius"; } } // 验证Kiekis(数字验证) if (empty($_POST["Kiekis"])) { $KiekErr = "Įveskite kiekį"; } else { $Kiekis = test_input($_POST["Kiekis"]); if (!is_numeric($Kiekis) || $Kiekis <= 0) { $KiekErr = "Kiekis turi būti teigiamas skaičius"; } } // 所有验证通过后,执行数据库插入 if (empty($VarErr) && empty($PavErr) && empty($AdErr) && empty($PreErr) && empty($PkErr) && empty($KiekErr)) { // 数据库连接配置(根据你的实际信息修改) $servername = "localhost"; $username = "你的数据库用户名"; $password = "你的数据库密码"; $dbname = "你的数据库名称"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 使用预处理语句防止SQL注入 $stmt = $conn->prepare("INSERT INTO 你的表名 (Vardas, Pavarde, Adresas, Preke, Pk, Kiekis) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->bind_param("ssssii", $Vardas, $Pavarde, $Adresas, $Preke, $Pk, $Kiekis); // 执行插入并提示结果 if ($stmt->execute()) { echo "<div class='alert alert-success'>Užsakymas sėkmingai įrašytas!</div>"; } else { echo "<div class='alert alert-danger'>Klaida įrašant užsakymą: " . $stmt->error . "</div>"; } // 关闭连接 $stmt->close(); $conn->close(); } } ?> <html class="no-js" lang="en"> <head> <title>Dailės parduotuvė</title> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> <link rel="stylesheet" type="text/css" href="css/stilius.css"> </head> <body class="content "> <div class="container"> <nav class="navbar navbar-expand-lg navbar-dark "> <a class="navbar-brand" href="index.html">Kauno dailė</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav ml-auto"> <li class="nav-item"> <a class="nav-link" href="Visos.html">Visos prekės</a> </li> <li class="nav-item"> <a class="nav-link" href="Uzsakymas.php">Užsisakymas</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Kontaktai</a> </li> </ul> </div> </nav> <div> <div class="content sm-4 text-center"> <h2>Užsisakymo forma</h2> <p><span class="error">* privalomi laukai</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> <p class="text-center">Vardas</p><br> <input type="text" name="Vardas" value="<?php echo $Vardas;?>"> <span class="error">* <?php echo $VarErr;?></span> <p class="text-center">Pavarde</p><br> <input type="text" name="Pavarde" value="<?php echo $Pavarde;?>"> <span class="error">* <?php echo $PavErr;?></span> <p class="text-center">Adresas</p><br> <input type="text" name="Adresas" value="<?php echo $Adresas;?>"> <span class="error">* <?php echo $AdErr;?></span><br> Prekės rūšis:<br> <input type="radio" name="Preke" value="Vienišas(-a)" <?php echo ($Preke == "Vienišas(-a)") ? "checked" : "";?>>Dažai(5€)<br> <input type="radio" name="Preke" value="Susituokęs(-usi)" <?php echo ($Preke == "Susituokęs(-usi)") ? "checked" : "";?>>Teptukas(2€)<br> <input type="radio" name="Preke" value="Išsiskyręs(-usi)" <?php echo ($Preke == "Išsiskyręs(-usi)") ? "checked" : "";?>>Pieštukas(2€)<br> <input type="radio" name="Preke" value="Našlys(-ė)" <?php echo ($Preke == "Našlys(-ė)") ? "checked" : "";?>>Ofiso įrankis(1€)<br> <span class="error">* <?php echo $PreErr;?></span> <br> <p class="text-center">Prekės kodas</p><br> <input type="number" name="Pk" value="<?php echo $Pk;?>"> <span class="error">* <?php echo $PkErr;?></span> <p class="text-center">Kiekis</p><br> <input type="number" name="Kiekis" value="<?php echo $Kiekis;?>"> <span class="error">* <?php echo $KiekErr;?></span> <br> <!-- Input For Add Values To Database--> <input type="submit" name="insert" value="Užsisakyti"> </form> </div> </div> </div> </body> </html>
额外说明
- 请根据你的实际数据库信息修改
$servername、$username、$password、$dbname和表名。 - 使用了预处理语句来防止SQL注入,这是处理用户输入的必要安全措施。
- 修复了单选按钮的回显逻辑:表单验证失败后,会保留用户之前选择的选项,提升用户体验。
内容的提问来源于stack exchange,提问作者Auridas
相关产品推荐
相关产品推荐

