PHP接收Ajax数据需据Content-Type区分处理:JSON需读php://input并json_decode;FormData走$_POST/$_FILES;默认x-www-form-urlencoded直接用$_POST。
Ajax提交表单时,$_POST 不一定能直接拿到数据——关键看前端用什么方式发的。如果前端用 fetch 或 XMLHttpRequest 发的是 application/json,那 PHP 默认根本不会解析进 $_POST,必须手动读取原始输入。
FormData 提交(含文件或普通字段)→ 数据在 $_POST 和 $_FILES 中可用JSON.stringify() 发送 → 必须用 file_
get_contents('php://input') 读取,再 json_decode()
jQuery.ajax() 且没设 contentType → 默认是 application/x-www-form-urlencoded,走 $_POST
if (isset($_SERVER['CONTENT_TYPE']) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
exit('Invalid JSON');
}
} else {
$data = $_POST;
}
常见错误:前端发了 JSON,但 PHP 脚本只写 print_r($_POST),结果空数组。这不是 PHP 问题,是协议不匹配。
Content-Type: application/json → PHP 不自动解析,$_POST 永远为空Content-Type: multipart/form-data → 只有 FormData 且含文件时才触发,此时 $_POST 仍可读普通字段Content-Type 缺失或为 text/plain → php://input 可读,但需自行解析,$_POST 无效用 FormData 是上传文件唯一可靠方式,但后端容易忽略两点:一是 $_FILES 键名对应前端 append() 的第一个参数;二是 PHP 配置限制(如 upload_max_filesize)会静默失败。
formData.append('avatar', fileInput.files[0]) → 后端用 $_FILES['avatar']
$_FILES['avatar']['error'] === UPLOAD_ERR_OK,别只看是否非空move_uploaded_file($_FILES['avatar']['tmp_name'], $dest),不能用 copy()
$targetDir = __DIR__ . '/uploads/';
if (!is_dir($targetDir)) mkdir($targetDir, 0755, true);
$fileName = uniqid() . '_' . basename($_FILES['avatar']['name']);
$targetPath = $targetDir . $fileName;
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $targetPath)) {
echo json_encode(['status' => 'success', 'path' => $targetPath]);
} else {
http_response_code(500);
echo json_encode(['error' => 'Failed to save file']);
}
} else {
http_response_code(400);
echo json_encode(['error' => 'Upload error: ' . $_FILES['avatar']['error']]);
}
Ajax请求和普通表单一样可被任意篡改,$_POST 或 json_decode 出来的数据必须当作不可信输入处理。
filter_input() 或 filter_var() 校验类型(如邮箱、整数),别只用 isset() 或 empty()
htmlspecialchars(),尤其当数据可能回显到页面error_log(print_r($_SERVER, true)); error_log(print_r($_POST, true)); error_log(file_get_contents('php://input'));,比猜快得多。
# mysql
# php
# jquery
# html
# js
# 前端
# json
# ajax
# 编码
# app
# session
# 后端
# ai
# sql
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】
Go语言中slice追加操作的底层共享机制详解
Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】
Win11怎么设置开机密码_Windows11账户登录选项PIN码
Python项目回滚策略_发布安全说明【指导】
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
php打包exe如何加密代码_防反编译保护方法【技巧】
如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例
Golang如何避免指针逃逸_Golang逃逸分析与堆栈优化策略
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭
如何使用Golang recover捕获panic_防止程序崩溃并处理异常
微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】
MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】
PHP主流架构怎么处理表单验证_规则与自定义【技巧】
PHP中require语句后直接调用返回对象方法的语法解析
Python数据抓取合法性_合规说明【指导】
Win11怎么把图标拖到任务栏_Win11固定应用快捷方式指南【方法】
c++如何连接Redis c++ hiredis库使用教程【指南】
如何在Golang中实现WebSocket广播_使用Channel和协程分发消息
Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
Win11怎么关闭系统透明度_Windows11个性化颜色透明效果
php会话怎么开启_session_start函数的作用与使用时机【方法】
Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】
c++ unordered_map怎么用 c++哈希表用法【教程】
Windows 10自带杀毒软件在哪_Windows 10打开和使用Windows安全中心
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
windows如何修改文件默认打开方式_windows设置程序关联教程
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】
Python实现图数据库操作_Neo4j核心CRUD与图算法解析
Win11怎么设置默认终端应用_Windows11开发者选项终端
如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类
Python脚本参数接收_sys与argparse解析【指导】
php打包exe怎么传递参数_命令行参数接收方法【解答】
如何在JavaScript中动态拼接PHP的base_url与JS变量
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
Python数据挖掘进阶教程_分类回归与聚类案例解析
如何用正则表达式精确匹配最多含一个换行符的起止片段
Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】
c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】
Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】
Win11右键反应慢怎么办 Win11优化右键菜单加载速度【技巧】
c# Task.ConfigureAwait(true) 在什么场景下是必须的
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】
Windows10如何更改盘符名称_Win10重命名硬盘分区卷标
Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。