Json Ajax PHP为空
我用GeolocationJavaScript获得一个数组,然后我想通过ajax将这个数组传递给一个php脚本来处理它,并得到一个处理后的数组。不幸的是,传递给php的数组似乎总是空的,我不知道为什么 我的JavaScript/jQuery:Json Ajax PHP为空,php,jquery,ajax,json,null,Php,Jquery,Ajax,Json,Null,我用GeolocationJavaScript获得一个数组,然后我想通过ajax将这个数组传递给一个php脚本来处理它,并得到一个处理后的数组。不幸的是,传递给php的数组似乎总是空的,我不知道为什么 我的JavaScript/jQuery: dataArray = []; var lat = pos.coords.latitude; dataArray.push({'lat':lat}); var lon = pos.coords.longitu
dataArray = [];
var lat = pos.coords.latitude;
dataArray.push({'lat':lat});
var lon = pos.coords.longitude;
dataArray.push({'lon':lon});
var identifier = 'ajax';
dataArray.push({'identifier':identifier});
console.debug(dataArray);
$.ajax({
async: true,
type: 'post',
cache: false,
url: 'custom.php',
data: {myJson: dataArray},
dataType : 'json',
success: function(data){
console.debug(data);
var json = $.parseJSON(data);
console.debug(json);
alert(json);
}
});
我的php:
$JSArray['array'] = json_decode($_POST['myJson'], true);
$_SESSION['jsonArray'] = $JSArray['array'];
var_dump($_SESSION);
结果总是
[“jsonArray”]=>NULL
试试这个。它对我有用
(function($){
if(navigator.geolocation){return;}
var domWrite = function(){
setTimeout(function(){
throw('document.write is overwritten by geolocation shim. This method is incompatible with this plugin');
}, 1);
},
id = 0
;
var geoOpts = $.webshims.cfg.geolocation.options || {};
navigator.geolocation = (function(){
var pos;
var api = {
getCurrentPosition: function(success, error, opts){
var locationAPIs = 2,
errorTimer,
googleTimer,
calledEnd,
endCallback = function(){
if(calledEnd){return;}
if(pos){
calledEnd = true;
success($.extend({timestamp: new Date().getTime()}, pos));
resetCallback();
if(window.JSON && window.sessionStorage){
try{
sessionStorage.setItem('storedGeolocationData654321', JSON.stringify(pos));
} catch(e){}
}
} else if(error && !locationAPIs) {
calledEnd = true;
resetCallback();
error({ code: 2, message: "POSITION_UNAVAILABLE"});
}
},
googleCallback = function(){
locationAPIs--;
getGoogleCoords();
endCallback();
},
resetCallback = function(){
$(document).unbind('google-loader', resetCallback);
clearTimeout(googleTimer);
clearTimeout(errorTimer);
},
getGoogleCoords = function(){
if(pos || !window.google || !google.loader || !google.loader.ClientLocation){return false;}
var cl = google.loader.ClientLocation;
pos = {
coords: {
latitude: cl.latitude,
longitude: cl.longitude,
altitude: null,
accuracy: 43000,
altitudeAccuracy: null,
heading: parseInt('NaN', 10),
velocity: null
},
//extension similiar to FF implementation
address: $.extend({streetNumber: '', street: '', premises: '', county: '', postalCode: ''}, cl.address)
};
return true;
},
getInitCoords = function(){
if(pos){return;}
getGoogleCoords();
if(pos || !window.JSON || !window.sessionStorage){return;}
try{
pos = sessionStorage.getItem('storedGeolocationData654321');
pos = (pos) ? JSON.parse(pos) : false;
if(!pos.coords){pos = false;}
} catch(e){
pos = false;
}
}
;
getInitCoords();
if(!pos){
if(geoOpts.confirmText && !confirm(geoOpts.confirmText.replace('{location}', location.hostname))){
if(error){
error({ code: 1, message: "PERMISSION_DENIED"});
}
return;
}
$.ajax({
url: 'http://freegeoip.net/json/',
dataType: 'jsonp',
cache: true,
jsonp: 'callback',
success: function(data){
locationAPIs--;
if(!data){return;}
pos = pos || {
coords: {
latitude: data.latitude,
longitude: data.longitude,
altitude: null,
accuracy: 43000,
altitudeAccuracy: null,
heading: parseInt('NaN', 10),
velocity: null
},
//extension similiar to FF implementation
address: {
city: data.city,
country: data.country_name,
countryCode: data.country_code,
county: "",
postalCode: data.zipcode,
premises: "",
region: data.region_name,
street: "",
streetNumber: ""
}
};
endCallback();
},
error: function(){
locationAPIs--;
endCallback();
}
});
clearTimeout(googleTimer);
if (!window.google || !window.google.loader) {
googleTimer = setTimeout(function(){
//destroys document.write!!!
if (geoOpts.destroyWrite) {
document.write = domWrite;
document.writeln = domWrite;
}
$(document).one('google-loader', googleCallback);
$.webshims.loader.loadScript('http://www.google.com/jsapi', false, 'google-loader');
}, 800);
} else {
locationAPIs--;
}
} else {
setTimeout(endCallback, 1);
return;
}
if(opts && opts.timeout){
errorTimer = setTimeout(function(){
resetCallback();
if(error) {
error({ code: 3, message: "TIMEOUT"});
}
}, opts.timeout);
} else {
errorTimer = setTimeout(function(){
locationAPIs = 0;
endCallback();
}, 10000);
}
},
clearWatch: $.noop
};
api.watchPosition = function(a, b, c){
api.getCurrentPosition(a, b, c);
id++;
return id;
};
return api;
})();
$.webshims.isReady('geolocation', true);
})(jQuery);
jQuery(window).ready(function(){
navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});
function successCallback(pos) {
$('#localstore').
load("geo?latitude="+ pos.coords.latitude +"&longitude=" + pos.coords.longitude, function()
{
$('#storefinder').hide();
$('#localstore').show();
});
}
function errorCallback(pos) {
/*
$('#storefinder').show();
$('#localstore').hide();
*/
}
});
脚本可能有多个失败点。 我会测试每一步,看看它失败的地方(通过一次注释一个echo语句): 另外,ajax调用应该包含
警报(数据)
而不包含parseJSON,因为服务器没有发送JSON,它只是回显一个var_转储:
$.ajax({
async: true,
type: 'post',
cache: false,
url: 'custom.php',
data: {myJson: dataArray},
dataType : 'html', // change back to json when you send json from server
success: function(data){
console.debug(data);
//var json = $.parseJSON(data);
//console.debug(json);
//alert(json);
alert(data);
}
});
为什么要使用JSON.stringify?我是ajax/JSON新手,我想我必须先对数组进行stringify,然后才能将其传递给php。但是如果我错了,请纠正我,这是不必要的。删除该行并尝试var_dump($_POST)以检查PHP中的内容。您可以尝试var_dump整个$_POST变量以查看原始数据是什么(更好的是$_REQUEST变量,它是$_GET、$_POST和$_COOKIE之间的组合,对于调试很有用,但在sharp代码中应该避免),发送响应时,最佳做法是在PHP:header('Content-type:application/Json')中回显Json之前添加响应;这使你的应用程序更加安全。如果你需要从PHP页面发送大量数据,那么你需要执行“echo json_encode($array);”发送通过json编码的数据。除非您临时将“dataType”更改为“html”,否则我不确定alert(data)会起什么作用,但我可能错了……当然,除非您像Husman刚才提到的那样将json_编码行添加到PHP中,以使其成为有效的json。但是原始文本可能更容易调试,直到您正确地获得对PHP的请求。您是正确的,必须将其设置为html才能工作,我现在将编辑我的答案。
$.ajax({
async: true,
type: 'post',
cache: false,
url: 'custom.php',
data: {myJson: dataArray},
dataType : 'html', // change back to json when you send json from server
success: function(data){
console.debug(data);
//var json = $.parseJSON(data);
//console.debug(json);
//alert(json);
alert(data);
}
});