AJAX传值至PHP失败排查请求:新手求助数据传递问题
问题排查与修复方案
别慌!新手刚接触AJAX+PHP的时候踩这个坑太正常了,我来帮你一步步捋清楚问题~
核心问题:AJAX的data参数格式错误
你现在写的data: name+email是把两个字符串直接拼接在一起(比如变成"张三test@xxx.com"),这种格式PHP根本无法解析成$_POST['name']和$_POST['email']这两个键值对,自然拿不到对应的数据。
正确的做法是传递键值对对象,让PHP能明确识别每个参数的名称。
额外的PHP端问题
除了AJAX的格式问题,你的PHP代码还有几个需要修正的细节:
mysqli_select_db('table1')用法错误:这个函数第一个参数是数据库连接对象,第二个是数据库名(不是表名),而且你已经引入了db.php,大概率已经完成了数据库连接和选择,这行可以直接删掉。- 变量初始化时机错误:
$fullname和$email在判断isset($_POST['email'])之前就赋值了,如果没有POST数据会直接报错,应该把这两行放到判断逻辑里面。 - 严重的SQL注入风险:直接把用户输入拼到SQL语句里是非常危险的操作,必须用预处理语句来避免。
- 冗余的
die:echo 'ok';之后用exit();就足够了,不用额外加die;。
修正后的JavaScript代码
function submitform1(){ var reg = /^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z]{2,4}$/i; var name = $('#signup_name_of_user').val(); var email = $('#signup_email_of_user').val(); if(name.trim() == '' ){ alert('Please enter your name.'); $('#signup_name_of_user').focus(); return false; }else if(email.trim() == '' ){ alert('Please enter your email.'); $('#signup_email_of_user').focus(); return false; }else if(email.trim() != '' && !reg.test(email)){ alert('Please enter valid email.'); $('#signup_email_of_user').focus(); return false; }else{ $.ajax({ type:'POST', url:'test_signup.php', // 改成键值对对象,PHP才能识别name和email参数 data: {name: name, email: email}, beforeSend: function () { $('.btn-light').attr("disabled","disabled"); $('.sign-up').css('opacity', '.5'); }, success: function(msg){ if(msg == 'ok'){ $('#signup_name_of_user').val(''); $('#signup_email_of_user').val(''); $('.statusMsg').html('<span style="color:green;">Thanks for contacting us, we\'ll get back to you soon.</span>'); }else{ $('.statusMsg').html('<span style="color:red;">Some problem occurred, please try again.</span>'); } // 请求完成后恢复按钮状态 $('.btn-light').removeAttr("disabled"); $('.sign-up').css('opacity', '1'); }, error: function() { // 增加错误处理,方便调试 $('.statusMsg').html('<span style="color:red;">Request failed, please check network.</span>'); $('.btn-light').removeAttr("disabled"); $('.sign-up').css('opacity', '1'); } }); } }
修正后的PHP代码
<?php include_once 'db.php'; // 先判断是否有完整的POST数据再处理 if(isset($_POST['email']) && isset($_POST['name'])) { $fullname = $_POST['name']; $email = $_POST['email']; // 用预处理语句查询邮箱是否存在,避免SQL注入 $checkdata = "SELECT signup_email_of_user FROM table1 WHERE signup_email_of_user = ?"; $stmt = mysqli_prepare($conn, $checkdata); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); if(mysqli_stmt_num_rows($stmt) > 0) { echo "err"; mysqli_stmt_close($stmt); exit(); } else { // 同样用预处理语句插入数据 $sql = "INSERT INTO table1 (signup_name_of_user, signup_email_of_user) VALUES (?, ?)"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ss", $fullname, $email); $result = mysqli_stmt_execute($stmt); echo $result ? 'ok' : 'err'; mysqli_stmt_close($stmt); exit(); } } else { // 没有接收到正确的POST参数时返回错误 echo 'err'; exit(); } ?>
内容的提问来源于stack exchange,提问作者Jeremy1948
相关产品推荐
相关产品推荐

