首先,我知道在StackOverflow上有很多非常相似的帖子。我已经把它们都看了一遍,但还是不能解决这个问题。
我有一个用户填写的表单,由于非常严格的JavaScript验证(必须保持在适当的位置),用户很可能在一两次失败后不得不返回表单。表单的提交触发一个JavaScript函数进行验证,然后使用AJAX将数据POST到PHP。
基本上,这些都发生在一个页面上。页面上有一个隐藏的div,在AJAX请求发出后通过jQuery加载,同时,表单本身随后被隐藏。页面根据从AJAX POST(通过$_POST)接收到的数据设置PHP变量,并通过cURL将此信息发送给API。
我正在调试'formData'对象之前张贴它与AJAX,它成功地捕获了我的信息,似乎是一个有效的对象。
当使用dataType: 'text'时,AJAX POST本身是成功的。但是,我需要dataType: 'json'。在将dataType: 'json'添加到我的AJAX POST后,它立即返回以下错误:SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
我的代码如下:
JAVASCRIPT/AJAX/JQUERY:
formData = {
"fname": $('#fname').val(),
"middle": $('#middle').val(),
"lname": $('#lname').val(),
"sex": gender,
"email": $('#email').val(),
"address1": $('#address1').val(),
"city": $('#city').val(),
"state": $('#state').val(),
"zip": $('#zip').val(),
"phone": $('#phone').val(),
"altphone": $('#altphone').val(),
"email": $('#email').val(),
"year": $('#year').val(),
"month": $('#month').val(),
"day": $('#day').val(),
"pass": $('#pass').val(),
"pin": $('#pin1').val() + $('#pin2').val() + $('#pin3').val() + $('#pin4').val(),
"ssn": $('#ssn1').val() + $('#ssn2').val() + $('#ssn3').val(),
"username": $('#username').val()
}
console.debug(formData);
// AJAX POST to the same page
$.ajax({
type: "POST",
url: 'index.php',
data: formData,
dataType: 'json',
success: function (data, textStatus, jqXHR) {
// Switch divs
$('#submit').addClass('visible');
$('#form').addClass('invisible');
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus + ': ' + errorThrown);
}
});
PHP代码#submit:
session_start();
// Variables
$fname = $_POST['fname'];
...
// Testing
var_dump($_POST);
echo "<br /><br />";
var_dump($_GET);
echo "<br /><br />";
var_dump($_REQUEST);
// cURL Stuff
$_POST, $_GET和$_REQUEST在使用dataType: 'text'时都返回空数组,尽管我很确定一旦JSON被修复,$_POST将正确通过。
我看不出JSON语法有什么问题,但它可能与AJAX应用的自动格式化有关。
希望这是一个微不足道的错误,有人可以很容易地发现!如果你能帮我找到,我将不胜感激:)
我认为您的问题是使用dataType
和您实际输出的内容。dataType
选项是告诉jQuery期望返回什么类型的数据。就我个人而言,我不喜欢它,因为jQuery可以很容易地猜出这一点。
第二,您实际上没有从PHP脚本输出任何JSON。PHP中的数组不会自动转换为JSON。你需要转换它。此外,您应该告诉浏览器使用标头会发生什么。在PHP中:
header("Content-Type: application/json"); //so jQuery knows what to expect
echo json_encode( $myArray );
exit;
json_encode ()
另一方面,省略dataType
的好处是它可以让您更好地控制误差。而不是调用JSON.parse
(jQuery为您使用dataType设置为json),您可以检查字符串是否是有效的json,如果不是,则向用户显示错误。
我找到解决方案了!实际上,我并没有返回到同一页面,而是返回到同一页面的刷新版本。因此,$_POST中不存在任何数据。我通过发布到一个单独的页面来解决这个问题,在那里设置内容类型,然后从该页抓取结果。