Подтвердить что ты не робот

$ _POST не работает в форме ajax submit?

Когда я пытаюсь проверить имя пользователя, уже существует форма ajax submit! Но он получает только 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");
}
?>
4b9b3361

Ответ 1

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

  • ... он получает только Undefined index: имя пользователя в session.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​​strong > (по умолчанию: true)
    Тип: Boolean
    По умолчанию данные, переданные в параметр данных в виде объекта (технически, ничего, кроме строки), будут обработаны и преобразованы в строку запроса, соответствуя стандартным формам content-type "application/x-www-form -urlencoded" . Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

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

  • .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 script следующим образом:

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

И на странице session.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"));
    }

?>

Ответ 2

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

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

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

contentType

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

Тип: логический или строковый. При отправке данных на сервер, используйте этот тип контента. По умолчанию "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 может содержать либо строку запроса формы key1 = value1 & key2 = value2 или объект формы {key1: 'value1', key2: 'value2'}. Если используется последняя форма, данные преобразуются в строку запроса, используя jQuery.param() перед отправкой. Эта обработку можно обойти, установив для параметра processData значение false. может быть нежелательным, если вы хотите отправить объект XML в сервер; в этом случае измените параметр contentType из application/x-www-form-urlencoded для более подходящего типа MIME.

Ответ 3

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

Ответ 4

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

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

    e.preventDefault();

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

});

Ответ 5

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

Ответ 6

Учитывая, что это ваша 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>

Ответ 7

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

Ответ 8

Вам нужно изменить script:

Попробуйте использовать 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 to false, что означает jQuery, чтобы не добавлять заголовок Content-Type. Вы используете метод jQuery.serialize(), который создает текстовую строку в стандартной кодировке с кодировкой URL. Вам необходимо передать некодированные данные при использовании "contentType: false".

Ответ 9

Измените script на

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

Ответ 10

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

processData : false,
contentType : false,  

Ответ 11

Удалите этот метод, действие: сообщение и пустое из вашего тега формы, поскольку вам нужно предоставить все данные только в методе ajax.

это решит проблему.

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