XAMPP环境下PHP连接MySQL插入数据失败排查求助
解决XAMPP中表单数据无法写入MySQL数据库的问题
嗨,我仔细看了你的代码,找到了几个导致数据没法写入数据库的核心问题,咱们一步步来修复:
1. 最直接的触发逻辑错误
你的表单提交按钮的name属性是submit,但代码里判断是否执行插入的条件是isset($_POST['insert'])——这就相当于你喊了"开门",但代码在等"开窗"的指令,永远不会触发插入逻辑!
修复方案:把判断条件改成isset($_POST['submit']),或者把按钮的name改成insert,前者更贴合你现有代码:
// 把原来的if(isset($_POST['insert']))改成: if(isset($_POST['submit'])) { // 插入逻辑放在这里 }
2. 数据库连接的异常处理无效
mysqli默认不会抛出异常,所以你写的try{ mysqli_connect(...); } catch(...)根本捕捉不到连接错误,应该手动检查连接是否成功:
$host = "localhost"; $user = "root"; $password =""; $database = "uzsakymas"; $connect = mysqli_connect($host,$user,$password,$database); // 手动检查连接 if (!$connect) { die("数据库连接失败: " . mysqli_connect_error()); }
3. Pk字段的错误处理逻辑错误
你在用户未填写Pk时,把$Pk赋值成了错误提示字符串"Įveskite prekės kodą",这会导致如果用户没填这个字段,插入数据库的是这段文本而不是空值,而且错误信息也没正确赋值给$PkErr:
// 修正前的错误代码 if (empty($_POST["Pk"])) { $Pk = "Įveskite prekės kodą"; // 这里应该给$PkErr赋值! } // 修正后 if (empty($_POST["Pk"])) { $PkErr = "Įveskite prekės kodą"; $Pk = ""; // 初始化空值,避免插入错误文本 } else { $Pk = test_input($_POST["Pk"]); }
4. 严重的SQL注入风险(必须修复!)
你的插入语句直接拼接用户输入的变量,存在极高的SQL注入漏洞,恶意用户可以通过这个漏洞篡改甚至删除你的数据库。必须使用预处理语句来避免这个问题:
if(isset($_POST['submit'])) { // 先检查所有表单验证是否通过 if(empty($VarErr) && empty($PavErr) && empty($AdErr) && empty($PkErr) && empty($KiekErr)){ // 使用预处理语句 $insert_query = "INSERT INTO uzsakymai (Vardas,Pavarde,Adresas,Pk,Kiekis) VALUES(?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($connect, $insert_query); // 绑定参数:"ssssi"表示5个参数分别是字符串、字符串、字符串、字符串、整数 mysqli_stmt_bind_param($stmt, "ssssi", $Vardas, $Pavarde, $Adresas, $Pk, $Kiekis); $insert_result = mysqli_stmt_execute($stmt); if($insert_result){ if(mysqli_affected_rows($connect) > 0) { echo '<p style="color:green;">数据已成功插入数据库!</p>'; }else{ echo '<p style="color:red;">数据未插入,请检查表结构和字段是否匹配!</p>'; } } else { echo '插入错误: ' . mysqli_error($connect); // 输出具体错误信息方便排查 } mysqli_stmt_close($stmt); } else { echo '<p style="color:red;">请先修正表单中的错误再提交!</p>'; } }
5. 调整插入逻辑的位置
把插入逻辑放在表单验证完成之后,确保只有当所有字段都验证通过时才执行插入,避免把无效数据写入数据库。
最后,给你整合好的完整修正代码:
<!DOCTYPE HTML> <html> <head> <style> .error {color: #FF0000;} </style> </head> <body> <?php // define variables and set to empty values $VarErr = $PavErr = $AdErr = $PkErr = $KiekErr = ""; $Vardas = $Pavarde = $Adresas = $Pk = $Kiekis = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["Vardas"])) { $VarErr = "Įveskite vardą"; } else { $Vardas= test_input($_POST["Vardas"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-zA-Z ]*$",$Vardas)) { $VarErr = "Galima vesti tik su raidėmis"; } } if (empty($_POST["Pavarde"])) { $PavErr = "Įveskite pavardę"; } else { $Pavarde = test_input($_POST["Pavarde"]); // check if name only contains letters and whitespace if (!preg_match("/^[a-zA-Z ]*$",$Pavarde)) { $PavErr = "Galima vesti tik su raidėmis"; } } if (empty($_POST["Adresas"])) { $AdErr = "Įveskite adresą"; } else { $Adresas= test_input($_POST["Adresas"]); } if (empty($_POST["Pk"])) { $PkErr = "Įveskite prekės kodą"; $Pk = ""; } else { $Pk = test_input($_POST["Pk"]); } if (empty($_POST["Kiekis"])) { $KiekErr = "Įveskite kiekį"; } else { $Kiekis = test_input($_POST["Kiekis"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } // 数据库连接 $host = "localhost"; $user = "root"; $password =""; $database = "uzsakymas"; $connect = mysqli_connect($host,$user,$password,$database); if (!$connect) { die("数据库连接失败: " . mysqli_connect_error()); } // 插入逻辑 if(isset($_POST['submit'])) { if(empty($VarErr) && empty($PavErr) && empty($AdErr) && empty($PkErr) && empty($KiekErr)){ $insert_query = "INSERT INTO uzsakymai (Vardas,Pavarde,Adresas,Pk,Kiekis) VALUES(?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($connect, $insert_query); mysqli_stmt_bind_param($stmt, "ssssi", $Vardas, $Pavarde, $Adresas, $Pk, $Kiekis); $insert_result = mysqli_stmt_execute($stmt); if($insert_result){ if(mysqli_affected_rows($connect) > 0) { echo '<p style="color:green;">数据已成功插入数据库!</p>'; }else{ echo '<p style="color:red;">数据未插入,请检查表结构和字段是否匹配!</p>'; } } else { echo '插入错误: ' . mysqli_error($connect); } mysqli_stmt_close($stmt); } else { echo '<p style="color:red;">请先修正表单中的错误再提交!</p>'; } } mysqli_close($connect); ?> <h2>PHP Form Validation Example</h2> <p><span class="error">* required field</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> Vardas: <input type="text" name="Vardas" value="<?php echo $Vardas;?>"> <span class="error">* <?php echo $VarErr;?></span> <br><br> Pavarde: <input type="text" name="Pavarde" value="<?php echo $Pavarde;?>"> <span class="error">* <?php echo $PavErr;?></span> <br><br> Adresas: <input type="text" name="Adresas" value="<?php echo $Adresas;?>"> <span class="error"><?php echo $AdErr;?></span> <br><br> Pk: <input type="number" name="Pk" value="<?php echo $Pk;?>"> <span class="error"><?php echo $PkErr;?></span> <br><br> Kiekis:<input type="number" name="Kiekis" value="<?php echo $Kiekis;?>"> <span class="error"><?php echo $KiekErr;?></span> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>Your Input:</h2>"; echo $Vardas; echo "<br>"; echo $Pavarde; echo "<br>"; echo $Adresas; echo "<br>"; echo $Pk; echo "<br>"; echo $Kiekis; ?> </body> </html>
内容的提问来源于stack exchange,提问作者Auridas
相关产品推荐
相关产品推荐

