it-roy-ru.com

$ _POST не работает в форме отправки ajax?

Когда я пытаюсь проверить, что введенное имя пользователя уже существует с помощью отправки формы ajax! Но оно получает только Undefined index: username в sessions.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");
}
?>
13
David Jaw Hpan

Есть несколько проблем с вашим кодом, таких как:

  • ... он получает только неопределенный индекс: имя пользователя в 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, чтобы он не устанавливал заголовки типов контента. 

    а также 

    processData (по умолчанию: true
    Тип: Boolean 
    По умолчанию данные, передаваемые в параметр данных в виде объекта (технически, что угодно, кроме строки), будут обрабатываться и преобразовываться в строку запроса, соответствующую стандартному content-type "application/x-www-form- urlencoded ". Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

    Следовательно, массив $_POST будет пустым на странице sessions.php, если вы установите для contentType и processData значение false, и именно поэтому вы получаете ошибку undefined index: username. Но, сказав, что, поскольку вы отправляете файл с вашим запросом AJAX, можно установить эти параметры равными false, что более подробно описано в следующем пункте.

  • .serialize() method создает текстовую строку в кодировке URL путем сериализации значений элементов управления формы, таких как <input>, <textarea> и <select>. Однако он не включает поле ввода файла при сериализации формы, и, следовательно, ваш удаленный обработчик AJAX вообще не получит файл. Поэтому, если вы загружаете файл через AJAX, используйте FormData object. Но имейте в виду, что старые браузеры не поддерживают объект 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"));
    }

?>
8
Rajdeep Paul

Если вы установите для contentType значение false, заголовок ajax не будет отправлен, в результате, если вы отправите какой-нибудь заголовок type:POST, он не будет содержать ваши данные, поэтому сервер не сможет их увидеть. Если вы используете для этого GET, это будет работать, потому что данные отправляются с GET (после url), а не в заголовок.

Просто удалите contentType

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

Тип содержимого 

(по умолчанию: 'application/x-www-form-urlencoded; charset = UTF-8') 

Тип: Boolean или String При отправке данных в сервер, используйте этот тип контента. По умолчанию "application/x-www-form-urlencoded; charset = UTF-8", что хорошо для большинство случаев. Если вы явно передаете тип содержимого в $ .ajax (), то он всегда отправляется на сервер (даже если данные не отправляются). По состоянию на В jQuery 1.6 вы можете передать false, чтобы указать jQuery не устанавливать никакого контента введите заголовок. Примечание: спецификация W3C XMLHttpRequest требует кодировка всегда UTF-8; указание другой кодировки не будет принудительным браузер для изменения кодировки. Примечание. Для междоменных запросов установка типа контента на что-либо кроме application/x-www-form-urlencoded, multipart/form-data или text/plain активирует браузер для отправки предварительного запроса OPTIONS на сервер.

processData используется для отправки данных как есть - Ajax документация

Отправка данных на сервер

По умолчанию запросы Ajax отправляются с использованием метода GET HTTP. Если Требуется метод POST, метод можно указать, установив значение для параметра типа. Эта опция влияет на то, как содержимое Опция данных отправляется на сервер. POST данные всегда будут передается на сервер с использованием кодировки UTF-8, согласно W3C Стандарт XMLHTTPRequest.

Опция data может содержать либо строку запроса в форме ключ1 = значение1 и ключ2 = значение2 или объект вида {ключ1: 'значение1', ключ2: «значение2»}. Если используется последняя форма, данные преобразуются в строку запроса, используя jQuery.param () перед отправкой. Это обработку можно обойти, установив для processData значение false. обработка может быть нежелательной, если вы хотите отправить объект XML в сервер; в этом случае измените параметр contentType с application/x-www-form-urlencoded для более подходящего типа MIME.

12
Griva

Вы устанавливаете для contentType значение false, поэтому PHP не может проанализировать тело сообщения

4
firegate666

Учитывая, что это ваша HTML-форма

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

Вы можете вызвать функцию jQuery следующим образом

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

Вы получите все параметры в вашем файле session.php, например

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

Я надеюсь, что это решит вашу проблему.

3
Ashish Nayyar

Используйте $ .post () для ajax: 

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

    e.preventDefault();

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

});
3
Dhara Parmar

Используйте следующий код в своем 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>
3
Amir Mohsen
<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>
2
Byeon0gam

Вам нужно изменить свой скрипт:

Попробуйте использовать new FormData вместо .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>

Примечание: Вы используете contentType - false, что означает, что jQuery не добавляет заголовок Content-Type. Вы используете метод .serialize () jQuery, который создает текстовую строку в стандартной нотации в кодировке URL. Вам необходимо передавать некодированные данные при использовании «contentType: false».

1
hardik solanki

Измените свой сценарий на 

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

Ваша кодировка верна. Удалите processData и contentType из Ajax, это будет работать

processData : false,
contentType : false,  
0
Mani