$_POST is not working in ajax form submit?

后端 未结 11 1563
遥遥无期
遥遥无期 2021-01-17 12:57

When I try to check user input name is already exist by ajax form submit !But it only get Undefined index: username in sessions.php ,what is missin

相关标签:
11条回答
  • 2021-01-17 13:32

    Considering this is your HTML form

     
        <form method="POST" id="saveuser" enctype="multipart/form-data">
             <input type="text" name="username" id="username"><br>
             <input type="password" name="pass" id="pass"><br>
             <input type="file" name="fileupload"><br>
             <input type="submit" name="submit" value="Confirm" id="confirm">
        </form>

    You can call the jQuery function like this

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-rc1/jquery.min.js"></script>
        jQuery("#saveuser").submit(function () {
        
        		//Validate the input here
        
        		jQuery.ajax({
        			type: 'POST',
        			url: 'sessions.php',
        			data: jQuery('#saveuser').serialize(),
        
        			success: function (msg) {
        				msg = jQuery.trim(msg);
        				if (msg == 'Success') {
                           //Do Whatever					
                           //jQuery("#thanks_message").show('slow');
        				}
        			}
        		});
        		return false;
        	});

    You will get all the params in your session.php file like

    <?php
    
      $username = trim($_POST['username']);
      $pass = trim($_POST['pass']);
      //rest of the params of the form
    
      $exist = "david";
      if ($username == $exist) {
        echo json_encode("Already exist");
      } else {
        echo json_encode("You can succesfully add");
      }
    ?>
    

    I hope this resolves your problem.

    0 讨论(0)
  • 2021-01-17 13:40

    There are few issues with your code, such as:

    • ... it only get Undefined index: username in sessions.php

      The problem is because of the following two lines,

      contentType : false,
      processData: false,
      

      From the documentation,

      contentType (default: 'application/x-www-form-urlencoded; charset=UTF-8')
      Type: Boolean or String
      When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header.

      and

      processData (default: true)
      Type: Boolean
      By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to 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() method creates a URL encoded text string by serializing form control values, such as <input>, <textarea> and <select>. However, it doesn't include file input field while serializing the form, and hence your remote AJAX handler won't receive the file at all. So if you're uploading file through AJAX, use FormData object. But keep in mind that old browsers don't support FormData object. FormData support starts from the following desktop browsers versions: IE 10+, Firefox 4.0+, Chrome 7+, Safari 5+, Opera 12+.

    • Since you're expecting a json object from server, add this setting dataType:'json' to your AJAX request. dataType is the type of data you're expecting back from the server.

    So the solution would be like this:

    Keep your HTML form as it is, and change your jQuery/AJAX script in the following way,

    $('#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);
            }
        });
    });
    

    And on sessions.php page, process your form like this:

    <?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"));
        }
    
    ?>
    
    0 讨论(0)
  • 2021-01-17 13:41

    Change your script to

    <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>
    
    0 讨论(0)
  • 2021-01-17 13:42

    If you set contentType to false, ajax header is not send, in result if you send somehing type:POST header doesn't contain your data, so server can't see it. If you use GET to do it, it will work, because data is sended with GET (after url) not in header.

    Just remove contentType

        $.ajax({
                type:'POST',
                url :"sessions.php",
                data: $("#saveuser").serialize(),
                success: function(d){
                    console.log(d);
                }
        });
    

    contentType

    (default: 'application/x-www-form-urlencoded; charset=UTF-8')

    Type: Boolean or String When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header. Note: The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. Note: For cross-domain requests, setting the content type to anything other than application/x-www-form-urlencoded, multipart/form-data, or text/plain will trigger the browser to send a preflight OPTIONS request to the server.

    processData is used to send data as it is - Ajax documentation

    Sending Data to the Server

    By default, Ajax requests are sent using the GET HTTP method. If the POST method is required, the method can be specified by setting a value for the type option. This option affects how the contents of the data option are sent to the server. POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard.

    The data option can contain either a query string of the form key1=value1&key2=value2, or an object of the form {key1: 'value1', key2: 'value2'}. If the latter form is used, the data is converted into a query string using jQuery.param() before it is sent. This processing can be circumvented by setting processData to false. The processing might be undesirable if you wish to send an XML object to the server; in this case, change the contentType option from application/x-www-form-urlencoded to a more appropriate MIME type.

    0 讨论(0)
  • 2021-01-17 13:45

    Use $.post() for ajax :

    $('#confirm').click(function(e){
    
        e.preventDefault();
    
        $.post("sessions.php", $.param($("#saveuser").serializeArray()), function(data) { // use this ajax code
           console.log(data);
        });
    
    });
    
    0 讨论(0)
  • 2021-01-17 13:47
    <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>
    
    0 讨论(0)
提交回复
热议问题