2016-06-07 3 views
13

Когда я пытаюсь проверить имя пользователя, имя уже существует по форме 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"); 
} 
?> 
+3

записи print_r ($ _ POST); в session.php, и вы нашли имя пользователя в этом массиве? –

+0

Является ли форма, которая у вас есть, на той же странице –

+0

У меня есть пустой массив, но на вкладке сети я могу видеть мои параметры! @Kaushalshah –

ответ

7

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

  • ... это только получить Undefined индекс: имя пользователя в sessions.php

    Проблема в том, что из следующих двух линий:

    contentType : false, 
    processData: false, 
    

    F ром the documentation,

    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
    По умолчанию, данные, передаваемые в к выбору данных в качестве объекта (технически, ничего, кроме строки) будет обрабатываться и преобразовываться в строку запроса, устанавливая по умолчанию контент-тип «application/x-www-form-urlencoded». Если вы хотите отправить DOMDocument или другие необработанные данные, установите этот параметр в false.

    Следовательно, $_POST массив будет пустым в sessions.php страницу, если вы установите contentType и processData к false, и именно поэтому вы получаете этот неопределенную индекс: имя пользователя ошибку. Но, сказав это, поскольку вы отправляете файл с вашим запросом 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 сценария следующим образом,

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

?> 
-5

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

это будет решать, надеюсь

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

Если ' method = "post" 'удаляется, то как он получит значения переменной $ _POST? – Apb

+0

вы делаете это с помощью ajax, если вы делаете это с помощью ajax, вам не нужен сам тег формы, на самом деле только ajax может делать что-то .. проводя переменные и данные .. попробуйте это один раз .. – LaviJ

+0

@ Apb вам не нужно ставить метод и атрибут действия в теге формы, когда вы отправляете форму с использованием метода ajax. – vartika

0

Изменить сценарий для

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

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

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

    e.preventDefault(); 

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

}); 
4

Вы устанавливаете CONTENTTYPE ложь, что почему PHP не может разобрать ваш почтовый ящик

3

Используйте следующий код в HTML код и удалить CONTENTTYPE: ложные, ProcessData: ложные

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

Вы должны изменить свой сценарий:

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

12

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

Просто удалить CONTENTTYPE

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

CONTENTTYPE

(по умолчанию: 'применение/х-WWW-форм-urlencoded; кодировка = UTF-8')

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

ProcessData используется для передачи данных, как это - Ajax documentation

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

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

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

3

Учитывая это ваш 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() { 
 
    
 
    \t \t //Validate the input here 
 
    
 
    \t \t jQuery.ajax({ 
 
    \t \t \t type: 'POST', 
 
    \t \t \t url: 'sessions.php', 
 
    \t \t \t data: jQuery('#saveuser').serialize(), 
 
    
 
    \t \t \t success: function (msg) { 
 
    \t \t \t \t msg = jQuery.trim(msg); 
 
    \t \t \t \t if (msg == 'Success') { 
 
         //Do Whatever \t \t \t \t \t 
 
         //jQuery("#thanks_message").show('slow'); 
 
    \t \t \t \t } 
 
    \t \t \t } 
 
    \t \t }); 
 
    \t \t return false; 
 
    \t });

You получит все параметры в вашей сессии.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"); 
    } 
?> 

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

+0

Я пробовал. Не удается запустить PHP-код фрагмента, но он работает для меня. –

+0

К сожалению, поскольку JS отправляет post params на страницу PHP, поэтому он не работает в Fiddle. Надеюсь, SO скоро будет реализовывать скрипт PHP. –

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

Ваше кодирование correct.Remove ProcessData и CONTENTTYPE от Ajax будет работать

processData : false, 
contentType : false, 
Смежные вопросы