当前位置: 首页 > 面试题库 >

$ _POST无法以ajax格式提交吗?

江浩慨
2023-03-14
问题内容

当我尝试通过ajax表单提交检查用户输入名称是否已经存在!但是它只能进入Undefined index: usernamesessions.php,缺少什么?

<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>

sessions.php

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

问题答案:

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

  • …它只会得到未定义的索引:sessions.php中的用户名

问题是由于以下两行,

    contentType : false,
processData: false,

从文档中,

的contentType (默认值:'application/x-www-form-urlencoded; charset=UTF-8'
类型:Boolean或者String
当发送数据到服务器时,使用该内容类型。默认值为“ application / x-www-form-urlencoded; charset =
UTF-8”,在大多数情况下都可以。如果您将内容类型显式传递给$.ajax(),则该内容类型将始终发送到服务器(即使没有发送数据)。从jQuery
1.6开始,您可以通过false告诉jQuery不要设置任何内容类型标头。


过程数据 (默认值:true
类型:Boolean
默认情况下,数据到数据选项传递作为一个对象(在技术上,不是字符串其它任何东西)将被处理并转换成一个查询字符串,以适应默认 内容类型“应用程序/ x
-www-form-urlencoded”
。如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false

Hence, $_POST array would be empty in sessions.php page if you set
contentType and processData to false, and that’s why you’re getting this
undefined index: username error. But having said that, since you’re sending
a file with your AJAX request, it’s okay to set these settings as false,
which is further explained in the following point.

  • .serialize()方法创建通过串行化形式的控制值,如一个URL编码的文本串<input><textarea><select>。但是,序列化表单时它不包含文件输入字段,因此您的远程AJAX处理程序将根本不会收到文件。因此,如果要通过AJAX上传文件,请使用FormData对象。但是请记住,旧的浏览器不支持FormData对象。FormData支持从以下桌面浏览器版本开始:IE 10 +,Firefox 4.0 +,Chrome 7 +,Safari 5 +,Opera 12+。

  • 由于您期望服务器提供json对象,因此请将此设置添加dataType:'json'到您的AJAX请求中。dataType是您期望从服务器返回的数据类型。

所以解决方案是这样的:

保持 HTML 表单不变,并通过以下方式更改 jQuery / AJAX 脚本,

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

    var formData = new FormData($('form')[0]);
    $.ajax({
        type: 'POST',
        url : 'sessions.php',
        data: formData,
        dataType: 'json',
        contentType: false,
        processData: false,            
        success: function(d){
            console.log(d.message);
        }
    });
});

然后在 sessions.php 页面上,像这样处理表单:

<?php

    $exist = "david";
    if(isset($_POST['username']) && !empty($_POST['username']) && isset($_POST['pass']) && !empty($_POST['pass'])){
        if($_POST['username'] == $exist){
            echo json_encode(array("message" => "Already exist"));
        }else{
            echo json_encode(array("message" => "You can succesfully add"));

            // get username and password
            $username = $_POST['username'];
            $password = $_POST['pass'];

            // process file input
            // Check whether user has uploaded any file or not
            if(is_uploaded_file($_FILES['fileupload']['tmp_name'])){

                // user has uploaded a file

            }else{
                // no file has been uploaded
            }
        }
    }else{
        echo json_encode(array("message" => "Invalid form inputs"));
    }

?>


 类似资料:
  • 问题内容: 我们从服务器获取数据,如果要使用Struts,则可以通过提交 MVC体系结构 的页面或我们进行 AJAX调用 的页面来获取,但是约定是使用表单和呈现响应,但是我们也面临着挑战,以提供丰富的用户体验,所以我们折衷了惯例并开始使用过多的AJAX,那么如何在两者之间取得平衡? 问题答案: 我个人认为AJAX应该用于显示更新,而表单提交应该通过重新加载页面来完成。推理? 提交表单时,您是在告诉

  • 问题内容: 我有一个包含几种形式的页面。我想添加一个提交按钮,该按钮将允许同时保存所有表单,如下所示: 我遇到的问题是,提交第一个表单后,它将页面重定向到该表单的目的地-我想拦截该重定向,以便我可以处理下一个表单。 我知道这可以通过AJAX完成,这将以某种方式允许我捕获返回的页面(如果我选择的话可以忽略它),但是我不知道如何在不映射表单中的每个字段的情况下执行此操作手动。 有人可以帮忙吗? 问题答

  • 问题内容: 我正在尝试通过ajax帖子提交多种表单,但是问题是服务器在帖子中返回了一个空数组。 这是我的JS中的代码: 在服务器端: 我究竟做错了什么?谢谢! 问题答案: 不,没有属性,其: 是标记中使用的属性。 样本输出 旁注:我认为更合适: 另一个例子

  • 问题内容: 我已经通过Ajax提交了表单,我无法在此提交中上传图片 在提交代码中 输出: JavaScript代码 问题答案: 使用该类最简单: 因此,现在您有了一个FormData对象,准备与XMLHttpRequest一起发送。并使用FormData对象附加字段 并强制jQuery不要为您添加Content-Type标头,否则,上传文件边界字符串将丢失。

  • Framework7 可以通过ajax自动提交 有两种自动提交方式: 当用户提交了表单 (点击了提交按钮) 或者当通过代码触发了 "submit" 事件 当用户更改了表单的内容,或者当通过代码触发了 "change" 事件 submit时提交表单数据 只需要添加 "ajax-submit" class 在form上,当submit时就会自动通过ajax发送表单数据 <form action="se

  • 问题内容: 我是Rails和jQuery的初学者。我在一页中有两个单独的表单,我想以ajax方式(使用jQuery)分别提交。这就是我走了多远。任何人都可以添加或修复此代码以使其正常工作。我正在使用Rails 3.1和jQuery 1.6。先感谢您。 application.js 第一种形式: 第二种形式: 学校负责人 CourseController与SchoolController的形状相同