如何在PHP中保留AJAX传递的带时区时间戳里的加号?
解决AJAX传递带时区时间戳时PHP端'+'号丢失的问题
问题原因
jQuery AJAX默认用application/x-www-form-urlencoded格式发送数据,HTTP协议里+会被解析成空格,导致PHP接收时+号变成空格,JSON解析失败。
解决办法
方法一:前端改用JSON格式发送(推荐)
直接把数据序列化为JSON字符串,设置请求头为application/json,绕开URL编码的问题:
$.ajax({ url: 'your_api.php', method: 'POST', contentType: 'application/json', data: JSON.stringify({"timestamp":"2024-04-10 12:32:00+02"}), success: function(res) { // 处理返回结果 } });
PHP端从原始输入流读取数据,再解析JSON:
$rawData = file_get_contents('php://input'); $data = json_decode($rawData, true); // 此时$data['timestamp']会完整保留带+号的时间戳
方法二:前端编码时间戳,后端解码
前端用encodeURIComponent对时间戳单独编码,把+转成合法的URL编码字符:
const timestamp = encodeURIComponent("2024-04-10 12:32:00+02"); $.ajax({ url: 'your_api.php', method: 'POST', data: {"timestamp": timestamp}, success: function(res) { // 处理返回结果 } });
PHP端用urldecode还原时间戳:
$timestamp = urldecode($_POST['timestamp']); // 得到正确的2024-04-10 12:32:00+02
方法三:PHP端直接修复原始POST数据(仅限前端无法修改的场景)
如果没法改前端代码,PHP可以读取原始POST数据,把空格替换回+后再解析:
$rawPost = file_get_contents('php://input'); // 注意:如果数据里原本就有正常空格,这个方法会误替换,谨慎使用 $fixedPost = str_replace(' ', '+', $rawPost); parse_str($fixedPost, $postData); $data = json_decode($postData['data'], true);
内容的提问来源于stack exchange,提问作者erik-stengel
相关产品推荐
相关产品推荐

