Javascript $\u POST在ajax表单提交中不起作用?

Javascript $\u POST在ajax表单提交中不起作用?,javascript,php,json,ajax,Javascript,Php,Json,Ajax,当我试图通过ajax表单提交检查用户输入名称是否已经存在时!但是它在sessions.php中只得到未定义的索引:username,缺少什么 <form action="" method="POST" id="saveuser" enctype="multipart/form-data"> <input type="text" name="username"><br> <input type="password" name="pass"><b

当我试图通过ajax表单提交检查用户输入名称是否已经存在时!但是它在
sessions.php
中只得到
未定义的索引:username
,缺少什么

<form action="" method="POST" id="saveuser" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="password" name="pass"><br>
<input type="file" name="fileupload"><br>
<input type="submit" name="submit" value="Confirm" id="confirm">
</form>
<script type="text/javascript">
    $('#confirm').click(function(e){
        e.preventDefault();
      $.ajax({
            type:'POST',
            url :"sessions.php",
            data:$("#saveuser").serialize(),
            contentType : false,
            processData: false,            
            success: function(d){
                console.log(d);//[error] :Undefined index: username 
            }
        });
    });
</script>




$(“#确认”)。单击(函数(e){ e、 预防默认值(); $.ajax({ 类型:'POST', url:“sessions.php”, 数据:$(“#saveuser”).serialize(), contentType:false, processData:false, 成功:功能(d){ console.log(d);//[错误]:未定义索引:用户名 } }); });
sessions.php

<?php
$exist = "david";
if($_POST['username'] == $exist){
    echo json_encode("Already exist");
}
else{
    echo json_encode("You can succesfully add");
}
?>

删除表单标签中的方法,操作:post和blank,因为您只需要在ajax方法中提供所有详细信息

或者您可以删除表单标记本身,因为ajax方法将处理post调用

这将有望解决问题

    <form id="saveuser" enctype="multipart/form-data">

将脚本更改为

<script type="text/javascript">
$(function(){
    $('#confirm').click(function(e){
        e.preventDefault();
      $.ajax({
            type:'POST',
            url :"sessions.php",
            data:$("#saveuser").serialize(),
            contentType : false,
            processData: false,            
            success: function(d){
                console.log(d);//[error] :Undefined index: username 
            }
        });
    });
});
</script>

$(函数(){
$(“#确认”)。单击(函数(e){
e、 预防默认值();
$.ajax({
类型:'POST',
url:“sessions.php”,
数据:$(“#saveuser”).serialize(),
contentType:false,
processData:false,
成功:功能(d){
console.log(d);//[错误]:未定义索引:用户名
}
});
});
});
将$.post()用于ajax:

$('#confirm').click(function(e){

    e.preventDefault();

    $.post("sessions.php", $.param($("#saveuser").serializeArray()), function(data) { // use this ajax code
       console.log(data);
    });

});

您正在将contentType设置为false,这就是为什么PHP无法解析您的帖子正文的原因

在html代码中使用以下代码并删除contentType:false, processData:false

<form action="" method="POST" id="saveuser" enctype="multipart/form-data">
    <input type="text" name="username"><br>
    <input type="password" name="pass"><br>
    <input type="file" name="fileupload"><br>
    <input type="submit" name="submit" value="Confirm" id="confirm">
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-rc1/jquery.min.js"></script>
<script type="text/javascript">
    $('#confirm').click(function(e){
        e.preventDefault();
        $.ajax({
            type:'POST',
            url :"sessions.php",
            data: $('#saveuser').serialize(),
            success: function(d){
                console.log(d);//[error] :Undefined index: username
            }
        });
    });
</script>
    $.ajax({
            type:'POST',
            url :"sessions.php",
            data: $("#saveuser").serialize(),
            success: function(d){
                console.log(d);
            }
    });




$(“#确认”)。单击(函数(e){ e、 预防默认值(); $.ajax({ 类型:'POST', url:“sessions.php”, 数据:$('#saveuser')。序列化(), 成功:功能(d){ console.log(d);//[错误]:未定义索引:用户名 } }); });
您需要更改脚本:

尝试使用
newformdata
而不是
.serialize()


$(“#确认”)。单击(函数(e){
e、 预防默认值();
var formData=new formData($(“#saveuser”)[0]);
$.ajax({
类型:'POST',
url:“tt.php”,
数据:formData,
contentType:false,
processData:false,
成功:功能(d){
console.log(d);//[错误]:未定义索引:用户名
}
});
});

注意:您被用于
contentType
false
,这意味着jQuery不添加内容类型标题。您正在使用jQuery的.serialize()方法,该方法以标准URL编码表示法创建文本字符串。当使用“contentType:false”时,您需要传递未编码的数据。

如果将contentType设置为false,则不会发送ajax头,结果是如果发送的内容
type:POST
头不包含您的数据,所以服务器无法看到它。如果您使用
GET
来执行此操作,它将起作用,因为数据是使用
GET
(url后)发送的,而不是在标题中

只需删除contentType

<form action="" method="POST" id="saveuser" enctype="multipart/form-data">
    <input type="text" name="username"><br>
    <input type="password" name="pass"><br>
    <input type="file" name="fileupload"><br>
    <input type="submit" name="submit" value="Confirm" id="confirm">
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-rc1/jquery.min.js"></script>
<script type="text/javascript">
    $('#confirm').click(function(e){
        e.preventDefault();
        $.ajax({
            type:'POST',
            url :"sessions.php",
            data: $('#saveuser').serialize(),
            success: function(d){
                console.log(d);//[error] :Undefined index: username
            }
        });
    });
</script>
    $.ajax({
            type:'POST',
            url :"sessions.php",
            data: $("#saveuser").serialize(),
            success: function(d){
                console.log(d);
            }
    });
contentType

(默认值:'application/x-www-form-urlencoded; 字符集=UTF-8')

类型:向服务器发送数据时为布尔值或字符串 服务器,请使用此内容类型。默认为 “application/x-www-form-urlencoded;charset=UTF-8”,适用于 大多数情况下。如果显式地将内容类型传递给$.ajax(),则 它总是发送到服务器(即使没有发送数据)。截至 jQuery 1.6您可以通过false告诉jQuery不要设置任何内容 键入标题。注意:W3CXMLHttpRequest规范规定 字符集总是UTF-8;指定另一个字符集不会强制 单击浏览器以更改编码。注意:对于跨域请求, 将内容类型设置为除 application/x-www-form-urlencoded、多部分/表单数据或text/plain 将触发浏览器向用户发送飞行前选项请求 服务器

processData用于按原样发送数据-

正在向服务器发送数据

默认情况下,Ajax请求使用GET HTTP方法发送。如果 如果需要POST方法,则可以通过设置 类型选项的值。此选项将影响 数据选项被发送到服务器。POST数据将始终为空 根据W3C,使用UTF-8字符集传输到服务器 XMLHTTPRequest标准

数据选项可以包含表单的查询字符串 key1=value1&key2=value2,或形式为{key1:'value1'的对象, 键2:'value2'}。如果使用后一种形式,则会转换数据 在发送查询字符串之前,使用jQuery.param()将其转换为查询字符串。这 通过将processData设置为false,可以避免处理。这个 如果希望将XML对象发送到,则可能不需要进行处理 服务器;在这种情况下,将contentType选项更改为 application/x-www-form-url编码为更合适的MIME类型


您的代码几乎没有问题,例如:

  • 。。。它只在sessions.php中获得未定义的索引:username

    <?php
    $exist = "david";
    if($_POST['username'] == $exist){
        echo json_encode("Already exist");
    }
    else{
        echo json_encode("You can succesfully add");
    }
    ?>
    
    问题在于以下两条线

    contentType : false,
    processData: false,
    

    contentType(默认值:
    'application/x-www-form-urlencoded;charset=UTF-8'

    类型:
    Boolean
    String

    向服务器发送数据时,请使用此内容类型。默认值为“application/x-www-form-urlencoded;charset=UTF-8”,这在大多数情况下都适用。如果您显式地将内容类型传递给
    $.ajax()
    ,那么它总是被发送到服务器(即使没有发送数据)。从jQuery1.6开始,您可以传递
    false
    来告诉jQuery
    <form method="POST" id="saveuser" enctype="multipart/form-data">
    <input type="text" name="username"/><br>
    <input type="password" name="pass"/><br>
    <input type="file" name="fileupload"/><br>
    <input type="button" name="save" id="save" value="save"/>
    </form>
    
    <script type="text/javascript">
        $('#save').click(function(e){
          var form = new FormData(document.getElementById('#saveuser'));  
    
          $.ajax({
    
                url :"sessions.php",
                type : 'POST',
                dataType : 'text',
                data : form,
    
                processData : false,
                contentType : false,  
                success: function(d){
                    console.log(d);//[error] :Undefined index: username 
                }
            });
        });
    </script>
    
    processData : false,
    contentType : false,