Ajax jQuery提交HTML表单数据至服务器失败问题排查
问题描述
我正在用Ajax jQuery将HTML表单数据保存到服务器,查阅了大量谷歌及Stack Overflow教程,但数据始终无法插入服务器。按下F12调试未发现控制台报错,以下是我的HTML代码与PHP代码,请帮忙指出问题所在:
HTML代码
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="Mcss.css"> <link rel="stylesheet" href="menu.css"> </head> <body style="margin:0; padding:0;"> <div class="main"> <div class="dd"></div> <center> <img class="image" src="HLogo.png"/> </center> <div class="dd1"></div> <div class="dd2"> <center> <p class="tt"><b>Harshal Trading Co.</b></p> </center> </div> <div id="container"> <ul id="menu"> <li><a href="index.html">Home</a></li> <li><a href="product.html">Products</a></li> <li><a href="contact.html">Contact Us</a></li> <li><a href="#">Order Now</a></li> <li><a href="#">Online Payment</a></li> </ul> </div> <div style="width:100%; height:500px;background:#DCDCDC"> <p style="margin-top:10px;font-size:30px;position:absolute;margin-left:2%;"><b>Place your order here</b></p> <form id="myform" action="" method="post"> <table style="width:100%; margin-top:60px; margin-left:2%;position:absolute"> <tr > <td style="margin:0;padding:0;width:1%;"><label for="name">Order Ref:</label></td> <td style="width:80%;"><label for="name" id="dtime">Order Ref:</label><br><br</td> </tr> <tr > <td style="margin:0;padding:0;width:1%;"><label for="name">Name:</label></td> <td style="width:80%;"><input type="text" id="fname" name="fname" style="height:35px;width:30%;padding-left:5px;"><br><br></td> </tr> <tr> <td><label for="mobile">Mobile:</label></td> <td><input type="text" id="mob" name="mob" style="height:35px;width:30%;padding- left:5px;"><br><br></td> </tr> <tr> <td><label for="eml">Email:</label></td> <td><input type="text" id="email" name="email" style="height:35px;width:30%;padding-left:5px;"><br><br></td> </tr> <tr> <td><label for="sb">Subject:</label></td> <td> <input type="text" id="subj" name="subj" style="height:35px;width:30%;padding-left:5px;"><br><br></td> </tr> <tr> <td><label for="dtt">Details:</label></td> <td><textarea name="det" cols="40" rows="5" id="det" style="padding- left:5px;padding-top:5px;"></textarea><br><br></td> </tr> <tr></tr><tr></tr><tr><td> </td><td> <input type="submit" class="button" name="insert" value="insert" style="width:100px; height:40px"/></td></tr> </table> </form> </div> </div> <div style="width:100%; height:300px;background-color:#DCDCDC;position:absolute;margin- top:10px;text-align:center"> <p style="font-family: 'Trebuchet MS', sans-serif; font-size:30px; margin:0; padding:0; margin-top:20px;color:red"><b><u>We Are Also Available On Following Link</u></b></p> <div class="dol"> <a href="https://www.facebook.com/profile.php?id=100087646165162"> <img src="logo/fb.webp" style="width:80px;height:80px;float:left;"/> </a> </div > <div class="dol"> <a href="https://twitter.com/harshaltrading"> <img src="logo/tol/ng/tw.png" style="width:80px;height:80px;float:left;"/> </a> </div> <div class="dol"> <img src="logo/tol/ng/insta.png"style="width:80px;height:80px;float:left;"/> </div> <div class="dol"> <a href="https://www.youtube.com/"> <img src="logo/tol/yt.png" style="width:80px;height:80px;float:left;"/> </a> </div> <p style="font-family: 'Trebuchet MS', sans-serif; font-size:20px; margin:0; padding:0; margin-top:15px;"><a href="#"><b>Privacy Policy</b></a></p> <p style="font-family: 'Trebuchet MS', sans-serif; font-size:20px; margin:0; padding:0; margin-top:15px;"><a href="#"><b>Terms & Condition</b></a></p> </div> <script > var dateDiv = document.getElementById('dtime'); Object.defineProperty(Date.prototype, 'YYYYMMDDHHMMSS', { value: function() { function pad2(n) { // always returns a string return (n < 10 ? '0' : '') + n; } return this.getFullYear() + pad2(this.getMonth() + 1) + pad2(this.getDate()) + pad2(this.getHours()) + pad2(this.getMinutes()) + pad2(this.getSeconds()); } }); dateDiv.innerHTML = new Date().YYYYMMDDHHMMSS(); </script> <script language="JavaScript" type="text/javascript" src="jquery-3.6.1.min.js"></script> <script> $(document).on('click', '.button', function(){ var dtime = $("#dtime").val(); var fname = $("#fname").val(); var mob = $("#mob").val(); var email = $("#email").val(); var subj = $("#subj").val(); var det = $("#det").val(); jQuery.ajax({ type: "POST", url: "http://harshaltrading.com/DBInsert/topinsert.php", dataType: 'json', data: {dtime: dtime, fname: fname, mob: mob, email: email, subj: subj, det: det}, success: function(res) { if (res) { alert('Hurray! Successfully done'); } }, error: function(xhr) { if (xhr) { alert('There was an error'); } } }); }); </script> </body> </html>
PHP代码
<?php include 'DatabaseConfig.php' ; $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName); if(!$con) { echo 'Not connected to server!'; } $dtime = $_POST['dtime']; $fname = $_POST['fname']; $mob = $_POST['mob']; $email = $_POST['email']; $subj = $_POST['subj']; $det = $_POST['det']; $Sql_Query = "insert into myorder (oid,name,mobile,email,sub,odet) values ('$dtime','$fname','$mob','$email','$subj','$det')"; if(mysqli_query($con,$Sql_Query)){ echo 'Thanks'; } else{ echo 'Try Again'; } mysqli_close($con); ?>
问题排查与修复方案
- 表单默认提交行为未阻止:点击提交按钮时,浏览器会触发表单默认提交动作,导致页面刷新,Ajax请求被中断。需在点击事件中添加
e.preventDefault()阻止默认行为。 - Order Ref值获取方式错误:
#dtime是<label>标签,.val()无法获取其内容,需改用.text()或.html()。 - Ajax数据类型不匹配:PHP返回纯文本,但Ajax设置
dataType: 'json'会导致解析失败进入错误回调。可去掉dataType让jQuery自动识别,或改为dataType: 'text'。 - SQL注入风险与语法错误:直接拼接用户输入到SQL语句存在注入风险,且输入含单引号会导致SQL语法错误,必须使用预处理语句绑定参数。
- PHP错误信息缺失:当前代码仅返回简单提示,无法排查具体错误,需开启错误提示并输出详细错误信息。
修改后的JavaScript代码
$(document).on('click', '.button', function(e){ // 阻止表单默认提交 e.preventDefault(); var dtime = $("#dtime").text(); var fname = $("#fname").val(); var mob = $("#mob").val(); var email = $("#email").val(); var subj = $("#subj").val(); var det = $("#det").val(); jQuery.ajax({ type: "POST", url: "http://harshaltrading.com/DBInsert/topinsert.php", data: {dtime: dtime, fname: fname, mob: mob, email: email, subj: subj, det: det}, success: function(res) { if (res.includes('Thanks')) { alert('Hurray! Successfully done'); } else { alert('提交失败: ' + res); } }, error: function(xhr, status, error) { alert('请求出错: ' + error + ',状态码: ' + status); } }); });
修改后的PHP代码(含预处理语句与错误处理)
<?php include 'DatabaseConfig.php'; // 开发环境开启错误提示,生产环境关闭 error_reporting(E_ALL); ini_set('display_errors', 1); $con = mysqli_connect($HostName, $HostUser, $HostPass, $DatabaseName); if (!$con) { die('数据库连接失败: ' . mysqli_connect_error()); } // 检查必填字段是否存在 $required = ['dtime', 'fname', 'mob', 'email', 'subj', 'det']; foreach ($required as $field) { if (!isset($_POST[$field]) || empty($_POST[$field])) { die('缺少必填字段: ' . $field); } } $dtime = $_POST['dtime']; $fname = $_POST['fname']; $mob = $_POST['mob']; $email = $_POST['email']; $subj = $_POST['subj']; $det = $_POST['det']; // 使用预处理语句防止SQL注入 $Sql_Query = "INSERT INTO myorder (oid, name, mobile, email, sub, odet) VALUES (?, ?, ?, ?, ?, ?)"; $stmt = mysqli_prepare($con, $Sql_Query); // 绑定参数(s代表字符串类型,可根据字段类型调整) mysqli_stmt_bind_param($stmt, 'ssssss', $dtime, $fname, $mob, $email, $subj, $det); if (mysqli_stmt_execute($stmt)) { echo 'Thanks'; } else { echo 'Try Again. 错误信息: ' . mysqli_stmt_error($stmt); } mysqli_stmt_close($stmt); mysqli_close($con); ?>
内容的提问来源于stack exchange,提问作者user2741987
相关产品推荐
相关产品推荐

