1. 主页 > 小妙招

JS如何向PHP传递参数?完整调用步骤与常见问题解决


你是不是经常遇到这种情况?明明在网页上点了提交按钮,PHP那边死活收不到数据。哎,这事儿我刚学的时候也头疼得要命!今天就手把手带你搞懂这个"新手如何快速涨粉"(划掉)不是,搞懂JS怎么给PHP传参数的正确姿势。


最基础的传参方式:GET请求

咱们先从最简单的开始。就像给人发短信一样,把参数直接写在网址里:

javascript复制
window.location.href = 'get_data.php?username=小明&age=18';

这时候PHP那边只需要:

php复制
$name = $_GET['username']; // 拿到"小明"
$age = $_GET['age'];      // 拿到18

??注意三个重点??:

  1. 问号?后面跟参数,多个参数用&连接
  2. 中文要用encodeURIComponent转码
  3. 参数值不要超过2000字符

但是吧,这种方法的缺点太明显了——所有参数都暴露在地址栏里。想象一下,你要是传密码...(疯狂摇头)


更安全的POST方法

就像寄快递要包包装盒,POST把参数藏在请求体里:

javascript复制
// 用表单提交
document.forms[0].submit();

// 或者用AJAX
var xhr = new XMLHttpRequest();
xhr.open('POST', 'submit.php');
xhr.send('email=test@qq.com&password=123456');

PHP这边要这么接:

php复制
$email = $_POST['email'];    // 正确姿势
$password = $_POST['password']; 

// 很多新手会犯这个错 ↓
$wrong = $_GET['password'];  // 永远拿不到!

??常见翻车现场??:

  • 忘记设置请求头Content-Type
  • 用$_REQUEST混用GET/POST导致数据混乱
  • 参数值包含&符号没转义

现在流行的Fetch API

年轻人都在用的新方法,用起来像点外卖一样方便:

javascript复制
fetch('api.php', {
  method: 'POST',
  body: JSON.stringify({ 
    productId: 666, 
    quantity: 2 
  }),
  headers: {
    'Content-Type': 'application/json'
  }
})

PHP这边要换种接收方式:

php复制
$json = file_get_contents('php://input'); // 重要!
$data = json_decode($json, true);
echo $data['productId']; // 拿到666

??对比传统方式??:

方式优点缺点
传统表单兼容性好会刷新页面
AJAX异步加载代码量多
Fetch语法简洁不兼容IE11以下

参数死活传不过去?八成是这些原因

  1. ??参数名对不上??:JS里写的是"user_name",PHP却用"username"
  2. ??没设置请求头??:特别是用JSON格式时,漏了Content-Type
  3. ??跨域问题??:本地文件打开网页时,浏览器会拦截请求
  4. ??编码问题??:中文变成乱码,记得在PHP里加header('Content-Type:text/html;charset=utf-8')

上周有个学员的案例特别典型:他给电商网站加购物车功能,结果每次传的商品ID都会少最后一位。你们猜怎么回事?原来是参数值里有特殊字符#,需要先用encodeURIComponent处理!


关于安全性的大实话

别以为参数传过去就完事了!有次我做项目,发现用户能直接修改传过去的商品价格...吓得赶紧加了验证:

php复制
// 不要相信前端传来的数据
$price = floatval($_POST['price']);
if($price < 0) {
  die("价格异常!");
}

??必做的三件事??:

  • 所有参数做类型过滤(intval、floatval)
  • 数字范围检查
  • 敏感操作要加CSRF_TOKEN验证

小编的踩坑心得

说真的,我到现在都记得第一次成功传参时的兴奋感。那天为了调试一个中文乱码问题,喝了三罐红牛,最后发现是JS没转码、PHP没设编码、数据库表字段还是latin1...三层错误叠加!所以啊,??遇到问题要分段排查??:先用console.log看发送内容,再用print_r($_POST)看接收情况,最后检查数据库编码。

现在教大家个绝招:在PHP开头加段调试代码,保准药到病除:

php复制
echo '
'
; print_r($_POST); echo '
'; exit();

暂时先写到这,你们赶紧动手试试,有什么问题评论区见——虽然我知道你们肯定懒得动手,但不动手真的学不会啊!(拍桌)

本文由嘻道妙招独家原创,未经允许,严禁转载