AngularJS传递数据至PHP页面后打印为null的问题求助
AngularJS传递数据至PHP页面后打印为null的问题求助
我明白你遇到的困扰了——想把AngularJS里选中的员工数据传给PHP页面并直接打印,但跳转后PHP拿到的是null,可Angular的AJAX回调却能正常收到返回值。其实问题出在你发起请求的逻辑上,我来帮你梳理并解决:
问题根源
你在salvar函数里做了两个独立的操作:
- 用
$http.post给salvar/teste.php发了一个带数据的AJAX请求 - 立刻执行
window.location.href = 'save/test.php'跳转到PHP页面
但这是两个完全无关的HTTP请求!第一个AJAX确实把数据传给了PHP,但第二个跳转是发起了全新的GET请求,这个请求里根本没有携带之前POST的任何数据,所以PHP自然拿不到内容,只能打印null。
解决方案
这里有两种实用的思路,你可以根据数据量和需求选择:
思路一:用Session暂存数据(推荐,适合数据量较大的场景)
先通过AJAX把数据传给PHP并存到Session,等请求完成后再跳转,跳转后的PHP页面读取Session里的数据即可。
- 修改Angular的
salvar函数,先统一收集选中数据再发送:
$scope.salvar = function(){ $scope.funciSelected = []; var n = $("input:checked").length - 1; if (n === 0) { $scope.funciSelected = 'No employees selected'; console.log('empty'); } else { // 先收集所有选中的员工数据 angular.forEach($scope.remessa, function(rem){ if (rem.selected) { $scope.funciSelected.push(rem); } }); // 统一发送数据到PHP存入Session $http.post('salvar/teste.php', {'selectedData': $scope.funciSelected}) .then(function(resu){ console.log('数据已保存,准备跳转'); // 必须等AJAX请求完成后再跳转 window.location.href = 'save/test.php'; }); } };
- 修改
salvar/teste.php,把接收的数据存入Session:
<?php session_start(); // 必须先开启Session // 接收Angular传来的JSON数据 $json = file_get_contents('php://input'); $obj = json_decode($json, TRUE); // 把选中的员工数据存入Session if(isset($obj['selectedData']) && !empty($obj['selectedData'])){ $_SESSION['selectedEmployees'] = $obj['selectedData']; } // 返回成功状态给Angular echo json_encode(['status' => 'success']); ?>
- 在跳转后的
save/test.php里读取并打印数据:
<?php session_start(); if(isset($_SESSION['selectedEmployees']) && !empty($_SESSION['selectedEmployees'])){ $employees = $_SESSION['selectedEmployees']; foreach ($employees as $emp) { echo "员工ID: {$emp['id_funci']}<br>"; echo "员工姓名: {$emp['nome']}<br>"; echo "税前薪资: {$emp['valorBruto']}<br>"; echo "税后薪资: {$emp['valorLiquido']}<br><hr>"; } // 用完后销毁Session,避免下次访问看到旧数据 unset($_SESSION['selectedEmployees']); } else { echo "没有选中的员工数据"; } ?>
思路二:通过URL参数传递数据(适合数据量小的场景)
如果选中的员工数据不多,可以把数据转成JSON字符串后通过URL参数传递,不需要依赖Session:
- 修改Angular的
salvar函数:
$scope.salvar = function(){ $scope.funciSelected = []; var n = $("input:checked").length - 1; if (n === 0) { $scope.funciSelected = 'No employees selected'; console.log('empty'); } else { angular.forEach($scope.remessa, function(rem){ if (rem.selected) { $scope.funciSelected.push(rem); } }); // 把数据转成JSON并编码,避免URL乱码 var encodedData = encodeURIComponent(JSON.stringify($scope.funciSelected)); // 直接跳转并携带参数 window.location.href = 'save/test.php?data=' + encodedData; } };
- 修改
save/test.php读取URL参数:
<?php if(isset($_GET['data'])){ // 解码并解析JSON数据 $decodedData = json_decode(urldecode($_GET['data']), TRUE); foreach ($decodedData as $emp) { echo "员工ID: {$emp['id_funci']}<br>"; echo "员工姓名: {$emp['nome']}<br>"; echo "税前薪资: {$emp['valorBruto']}<br>"; echo "税后薪资: {$emp['valorLiquido']}<br><hr>"; } } else { echo "没有传递数据"; } ?>
注意事项
- 使用Session时,必须在所有涉及Session的PHP页面开头调用
session_start(),确保Session功能正常 - 可以用
json_last_error()排查PHP的json_decode是否出错,比如JSON格式异常时能定位问题 - Angular的
$http.post默认发送JSON格式数据,所以PHP用file_get_contents('php://input')接收是正确的,不要用$_POST(它只处理application/x-www-form-urlencoded格式的数据)
备注:内容来源于stack exchange,提问作者Gregory Carmo
相关产品推荐
相关产品推荐

