当我尝试检查用户输入名称是否已经由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");
}
?>
答案 0 :(得分:12)
如果您将 contentType 设置为 false ,则不会发送ajax标头,如果您发送somehing type:POST
标头,则结果不包含您的数据,因此服务器看不到它。如果您使用GET
来执行此操作,则会有效,因为数据是使用GET
(在网址之后)不在标头中发送的。
只需删除 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规范规定了这一点 charset总是UTF-8;指定另一个字符集不会强制 浏览器更改编码。注意:对于跨域请求, 将内容类型设置为除以外的任何内容 application / x-www-form-urlencoded,multipart / form-data或text / plain 将触发浏览器发送预检OPTIONS请求 服务器
processData用于按原样发送数据 - Ajax documentation
将数据发送到服务器
默认情况下,使用GET HTTP方法发送Ajax请求。如果 需要POST方法,可以通过设置a来指定方法 type选项的值。此选项会影响内容的方式 数据选项被发送到服务器。 POST数据永远是 根据W3C,使用UTF-8字符集传输到服务器 XMLHTTPRequest标准。
data选项可以包含表单的查询字符串 key1 = value1&amp; key2 = value2,或{key1:'value1'形式的对象, key2:'value2'}。如果使用后一种形式,则转换数据 在发送之前使用jQuery.param()将查询字符串转换为查询字符串。这个 可以通过将processData设置为 false 来规避处理。该 如果您希望发送XML对象,则可能不希望进行处理 服务器;在这种情况下,请更改contentType选项 application / x-www-form-urlencoded为更合适的MIME类型。
答案 1 :(得分:8)
您的代码存在一些问题,例如:
...它只获得未定义的索引: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
默认情况下,作为对象传入数据选项的数据(技术上,除了字符串之外的任何东西)将被处理并转换为查询字符串,适合默认的内容类型“application / x-www-form -urlencoded“即可。如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false
。
因此,如果您将$_POST
和contentType
设置为processData
,false
数组在 sessions.php 页面中将为空,这就是原因你得到这个未定义索引:用户名错误。但话虽如此,由于您发送的文件包含您的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"));
}
?>
答案 2 :(得分:4)
您将contentType设置为false,这就是PHP无法解析您的帖子主体
的原因答案 3 :(得分:3)
对ajax使用$ .post():
$('#confirm').click(function(e){
e.preventDefault();
$.post("sessions.php", $.param($("#saveuser").serializeArray()), function(data) { // use this ajax code
console.log(data);
});
});
答案 4 :(得分:3)
在html代码中使用以下代码并删除 contentType:false, processData:false
$mdMenuIsOpen
答案 5 :(得分:3)
考虑到这是您的HTML表单
<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;
});
您可以像这样调用jQuery函数
<?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");
}
?>
您将获得session.php文件中的所有参数,如
// open serial port
/* O_RDWR means that the port is opened for both reading and writing
* O_NOCTTY means that no terminal will control the process opening the serial port
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); // /dev/ttyS1
if (fd <0)
perror(MODEMDEVICE);
tcgetattr(fd,&SerialPortSettings); /* save current serial port settings */
/* Set Baud Rate */
cfsetospeed (&SerialPortSettings, (speed_t)B230400);
cfsetispeed (&SerialPortSettings, (speed_t)B230400);
SerialPortSettings.c_iflag &= ~IGNBRK; // disable break processing
SerialPortSettings.c_lflag = 0; // no signaling chars, no echo, no canonical processing
SerialPortSettings.c_oflag = 0; // no remapping, no delays
/* Setting other Port Stuff */
SerialPortSettings.c_cflag &= ~PARENB; /* No Parity */
SerialPortSettings.c_cflag &= ~CSTOPB; /* Stop bits = 1 */
SerialPortSettings.c_cflag &= ~CSIZE; /* Clears the Mask */
SerialPortSettings.c_cflag |= CS8; /* Set the data bits = 8 */
SerialPortSettings.c_cflag &= ~CRTSCTS; /* Turn off hardware based flow control */
SerialPortSettings.c_cc[VMIN] = 0; // read doesn't block // specifies the minimum number of characters that should be read before the read() call returns
SerialPortSettings.c_cc[VTIME] = 10; // 1 seconds read timeout
SerialPortSettings.c_cflag |= CREAD | CLOCAL; /* Turn on the receiver of the serial port */
SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); /* Turn off software based flow control */
tcsetattr ( fd, TCSANOW, &SerialPortSettings ); //TCSANOW tells to make the changes now without waiting
我希望这可以解决你的问题。
答案 6 :(得分: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>
答案 7 :(得分: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标头。您正在使用jQuery的.serialize()方法,该方法使用标准的URL编码表示法创建文本字符串。使用&#34; contentType:false&#34;。
答案 8 :(得分: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>
答案 9 :(得分:0)
您的编码是正确的。从Ajax移除processData和contentType它将起作用
processData : false,
contentType : false,
答案 10 :(得分:-5)
删除方法,操作:从表单标记发布和空白,因为您只需要在ajax方法中提供所有详细信息。
或者您可以删除表单标记本身,因为ajax方法将负责发布调用。
这将有希望解决
<form id="saveuser" enctype="multipart/form-data">