我怀疑这可能是服务器问题,但由于我无法访问我们的服务器,我希望其他人可能有修复程序或可以向我解释导致问题的确切原因。
问题....
使用 JQuery AJAX,我无法同时将数据发布到 php 文件并从 php 文件接收 json 编码数据。 如果包含 json 数据类型,我无法将数据从表单发布到 php 文件。 如果我不指定 json 数据类型(即注释掉(,那么我可以将数据发布到 php 文件,但无法接收 json 编码的数据。
我已经用我自己的 js/php 代码和我下载的源代码尝试过这个,以便比较结果,以防这只是我的编码错误。 两者都是"提交表格",并且都表现出上述问题。 如果相关,我在下面包含下载的源代码。 我的js/php代码使用类似的ajax请求。
javaScript:
<script type="text/javascript">
$(document).ready(function(){
$("#myForm").submit(function(){
dataString = $("#myForm").serialize();
$.ajax({
type: "POST",
url: "postForm_ajax.php",
data: $("#myForm").serialize(),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(msg){
$("#formResponse").removeClass('error');
$("#formResponse").addClass(msg.status);
$("#formResponse").addClass(msg.status);
},
error: function(){
$("#formResponse").removeClass('success');
$("#formResponse").addClass('error');
$("#formResponse").html("There was an error submitting the form. Please try again.");
}
});
//make sure the form doens't post
return false;
});
});
</script>
PHP:
<?php
//function to validate the email address
//returns false if email is invalid
function checkEmail($email){
if(!preg_match("/^[_'.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+'.)+[a-zA-Z]{2,6}$/i", $email)) {
//if(eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9'-]+'.[a-zA-Z0-9'-'.]+$]", $email)){
return FALSE;
}
list($Username, $Domain) = explode("@",$email);
if(@getmxrr($Domain, $MXHost)){
return TRUE;
} else {
if(@fsockopen($Domain, 25, $errno, $errstr, 30)){
return TRUE;
} else {
return FALSE;
}
}
}
//response array with status code and message
$response_array = array();
//validate the post form
//$name = $_POST['name'];
//check the name field
if(empty($_POST['name'])){
//set the response
$response_array['status'] = 'error';
$response_array['message'] = 'Name is blank';
//check the email field
} elseif(!checkEmail($_POST['email'])) {
//set the response
$response_array['status'] = 'error';
$response_array['message'] = 'Email is blank or invalid';
//check the message field
} elseif(empty($_POST['message'])) {
//set the response
$response_array['status'] = 'error';
$response_array['message'] = 'Message is blank';
//form validated. send email
} else {
//send the email
$body = $_POST['name'] . " sent you a message'n";
$body .= "Details:'n'n" . $_POST['message'];
mail($_POST['email'], "SUBJECT LINE", $body);
//set the response
$response_array['status'] = 'success';
$response_array['message'] = 'Email sent!';
}
echo json_encode($response_array);
?>
编辑。。。。一个解决方案
还行。。。所以我找到了一个有效的黑客。 我没有指定 dataType:'json',即注释该行和 contenType 行。 然后我就可以发布数据了。 仍然让 php 文件回显 json_encode($response_array(。 然后将以下代码放入成功函数中
var obj = jQuery.parseJSON(msg);
$("#formResponse").addClass(obj.status);
$("#formResponse").html(obj.message);
这不如能够在 ajax 调用中指定 dataType:'json' 那么好。 如果有人有更好的解决方案或可以解释为什么会出现此问题,请告诉我。
谢谢
据我说,你没有做错任何事......除了你指定了很多事情...
例如: dataType: "json",
足以让 ajax 调用工作....没有必要
contentType: "application/json; charset=utf-8",
在您的代码中,如果您添加此行,它将返回空数组作为返回,出于某种原因(不太确定实际原因(....
但是我指定的时刻
dataType: "json",
它就像一个魅力,作为回报,我得到了对象,我不需要解析。
编辑:
我尝试的如下...只需将输入名称从name
更改为 FNAME,它工作得很好
<form id="myForm" name="myForm" method="POST"
action="postform_ajax.php">
name: <input type="text" name="fname" /> <br /> email: <input
type="text" name="email" /> <br /> message: <input type="message"
name="message" /> <br /> <input type="submit" />
<div id="formResponse"></div>
</form>
<script type="text/javascript"
src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#myForm").submit(function() {
dataString = $("#myForm").serialize();
$.ajax({
type : "POST",
url : "postForm_ajax.php",
data : $("#myForm").serialize(),
dataType : "json",
success : function(msg) {
$("#formResponse").removeClass('error');
$("#formResponse").addClass(msg.status);
$("#formResponse").html(msg.status);
},
error : function() {
console.log('err', msg);
$("#formResponse").removeClass('success');
$("#formResponse").addClass('error');
$("#formResponse").html("There was an error submitting the form. Please try again.");
}
});
//make sure the form doens't post
return false;
});
});
</script>