13

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

<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");
}
?>
8
  • 3
    write print_r($_POST); in session.php and did you find username in that array? Commented Jun 7, 2016 at 7:05
  • Is the Form which you have is in the same page Commented Jun 7, 2016 at 7:10
  • I got empty array ,but in the network tab I can see my parameters ! @Kaushalshah Commented Jun 7, 2016 at 7:14
  • it means your form value not Posted properly. Commented Jun 7, 2016 at 7:19
  • Yes there has! But no details explanation about using contentType :false @Yvette Commented Jun 9, 2016 at 14:12

11 Answers 11

12
+50

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.

9

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"));
    }

?>
4

You are setting contentType to false, that is why PHP can not parse your post body

3

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);
    });

});
3

Use the following code in your html code and remove 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>
3

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.

2
  • I tried. Cant run PHP snippet code but it works for me. Commented Jun 14, 2016 at 10:58
  • Unfortunately, since JS is sending post params to a PHP page that's why it doesn't work in Fiddle. I hope SO will implement PHP fiddle soon. Commented Jun 14, 2016 at 11:17
2
<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>
1

You need to change your script:

Try using new FormData instead of .serialize().

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

Note : You are used contentType to false that mean jQuery not to add a Content-Type header. You are using jQuery's .serialize() method which creates a text string in standard URL-encoded notation. You need to pass un-encoded data when using "contentType: false".

0

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

Your coding is correct.Remove processData and contentType from Ajax it will work

processData : false,
contentType : false,  
-5

Remove that method,action: post and blank from your form tag as you need to give all details in ajax method only.

or you can delete the form tag itself as ajax method will take care of the post call.

this will solve hopefully

    <form id="saveuser" enctype="multipart/form-data">
5
  • 2
    If method="post" is removed then how he will get $_POST variable values?
    – Apb
    Commented Jun 7, 2016 at 7:12
  • you are doing this by ajax if you are doing it with ajax you do not need form tag itself actually only ajax can do things.. posting variables and data .. try this once..
    – LaviJ
    Commented Jun 7, 2016 at 7:15
  • @ Apb you don't need to put method and action attribute in form tag as you are submitting form using ajax method.
    – vartika
    Commented Jun 7, 2016 at 7:17
  • Yes. There is no need to write method="post" while submit form using ajax. If you didn't mentioned method it will consider as GET method by default. On submit click, all parameters details will be shown in URL. If you want to avoid this you need to metion e.preventDefault(); on submit click.
    – Apb
    Commented Jun 7, 2016 at 7:23
  • that is because of action given there.. just remove form tag completely.. and you will not get any kind of these problems...(y)
    – LaviJ
    Commented Jun 7, 2016 at 7:41

Not the answer you're looking for? Browse other questions tagged or ask your own question.