You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS传递数据至PHP页面后打印为null的问题求助

AngularJS传递数据至PHP页面后打印为null的问题求助

我明白你遇到的困扰了——想把AngularJS里选中的员工数据传给PHP页面并直接打印,但跳转后PHP拿到的是null,可Angular的AJAX回调却能正常收到返回值。其实问题出在你发起请求的逻辑上,我来帮你梳理并解决:

问题根源

你在salvar函数里做了两个独立的操作:

  1. 用$http.post给salvar/teste.php发了一个带数据的AJAX请求
  2. 立刻执行window.location.href = 'save/test.php'跳转到PHP页面

但这是两个完全无关的HTTP请求!第一个AJAX确实把数据传给了PHP,但第二个跳转是发起了全新的GET请求,这个请求里根本没有携带之前POST的任何数据,所以PHP自然拿不到内容,只能打印null。

解决方案

这里有两种实用的思路,你可以根据数据量和需求选择:

思路一:用Session暂存数据(推荐,适合数据量较大的场景)

先通过AJAX把数据传给PHP并存到Session,等请求完成后再跳转,跳转后的PHP页面读取Session里的数据即可。

  1. 修改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';
        });
    }
};
  1. 修改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']);
?>
  1. 在跳转后的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:

  1. 修改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;
    }
};
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:49:35