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

无法从Android获取POST数据:PHP接口Postman测试正常但线上失效

解决POST接口在线上Android调用时变量被清空的问题

我碰到过不少类似的情况——Postman测着好好的,一到移动端线上调用就出问题,结合你的代码和场景,给你梳理几个关键排查方向和修复方案:

1. 优先使用$_POST替代$_REQUEST获取参数

你的代码里用了$_REQUEST来拿POST参数,但这个变量的取值顺序受PHP配置(request_order/variables_order)影响,线上环境的配置可能和本地Postman测试时不一样,导致参数读取异常。直接用$_POST来获取POST请求的参数更稳妥,比如:

// 把原来的$_REQUEST改成$_POST
$appuserid = $_POST['tid'];
$correctans = $_POST['correct'];
$totalqns = $_POST['size'];
// 其他参数同理修改

2. 确认Android端请求的Content-Type和参数格式

Postman默认会帮你设置正确的表单请求头,但Android端如果没配置好,会导致服务器无法解析POST数据:

  • 如果是表单提交,Android端必须设置Content-Type: application/x-www-form-urlencoded,并且把参数以键值对的形式编码后放在请求体里;
  • 如果Android端发送的是JSON格式,那你的PHP代码目前是无法通过$_POST获取的,需要改用file_get_contents('php://input')读取原始请求体,再用json_decode解析:
$postData = json_decode(file_get_contents('php://input'), true);
$appuserid = $postData['tid'];
// 后续参数从$postData里获取

3. 检查线上服务器的PHP配置

线上环境的PHP配置可能限制了POST数据的接收:

  • 查看post_max_size和upload_max_filesize的值,如果请求体大小超过这个配置,POST参数会被直接清空;
  • 确认enable_post_data_reading设置为On,这个选项关闭的话,PHP无法读取POST请求体。

4. 紧急修复SQL注入风险(重要)

你的代码里直接把用户输入拼接到SQL语句里,这是非常危险的,很容易被SQL注入攻击。赶紧改用预处理语句,比如用mysqli的预处理方式:

// 示例:更新分数的预处理语句
$stmt = $m->con->prepare("UPDATE tbl_user_score SET `time`=?, `date`=?, `correctans`=?, `incorrectans`=?, `score`=? WHERE `userid`=? AND `subjectid`=? AND `categoryid`=? AND `sub_sub_categoryid`=?");
$stmt->bind_param("ssdddisii", $time, $date, $correctans, $incorrectans, $score, $userid, $subjectid, $sub_categoryid, $sub_sub_categoryid);
$stmt->execute();

所有涉及用户输入的SQL操作都要改成这种方式,避免被攻击。

5. 调试技巧:记录请求详情

可以在接口开头加一段调试代码,把请求的所有信息记录到日志里,方便排查问题:

// 记录请求信息到日志文件
$logContent = "请求方法:" . $_SERVER['REQUEST_METHOD'] . "\n";
$logContent .= "请求头:" . print_r(getallheaders(), true) . "\n";
$logContent .= "POST参数:" . print_r($_POST, true) . "\n";
$logContent .= "原始请求体:" . file_get_contents('php://input') . "\n\n";
file_put_contents('/tmp/post_debug.log', $logContent, FILE_APPEND);

通过日志可以清楚看到Android端发送的请求是否符合预期,是参数没传对,还是服务器端接收有问题。

附上你提供的代码(已修正HTML实体转义):

<?php 
require '../../include/config.php'; 
if(strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') { 
    $appuserid = $_REQUEST['tid']; 
    $score = 0; 
    $time = date('h:i:s'); 
    $date = date('Y-m-d'); 
    $correctans = $_REQUEST['correct']; 
    $totalqns = $_REQUEST['size']; 
    $correct = $_REQUEST['correctquestionid']; 
    $incorrect = $_REQUEST['incorrectquestionid']; 
    $correct_array = explode(',',$correct); 
    $incorrect_array = explode(',',$incorrect); 
    $wishlistid = '0'; 
    $incorrectans = $totalqns-$correctans; 
    if($totalqns!='') { 
        $score = round($correctans/$totalqns*100,2); 
        $totalpoints = round($totalqns/$totalqns*100,2); 
    } 
    $qryselchk = $m->executeSelectQuery("SELECT * FROM `tbl_user_score` WHERE `userid`='$userid' AND `subjectid`='$subjectid' AND `categoryid`='$sub_categoryid' AND `sub_sub_categoryid`='$sub_sub_categoryid'"); 
    if(mysqli_num_rows($qryselchk)>=1) { 
        $qryins = $m->executeQuery("UPDATE `tbl_user_score` SET `time`='$time',`date`='$date',`correctans`='$correctans',`incorrectans`='$incorrectans',`score`='$score' WHERE `userid`='$userid' AND `subjectid`='$subjectid' AND `categoryid`='$sub_categoryid' AND `sub_sub_categoryid`='$sub_sub_categoryid'"); 
        $qryremove = $m->executeQuery("DELETE FROM `tbl_user_quize_report` WHERE `quizeid`='$sub_sub_categoryid'"); 
        foreach ($correct_array as $C) { 
            $qryins_correct = $m->executeQuery("INSERT INTO `tbl_user_quize_report`(`qnid`,`quizeid`,`userquizid`,`userid`,`answerflag` ,`last_date_added`) VALUES ('$C','$sub_sub_categoryid','0','$userid','1',NOW())"); 
        } 
        foreach ($incorrect_array as $I) { 
            $qryins_incorrect = $m->executeQuery("INSERT INTO `tbl_user_quize_report`(`qnid`,`quizeid`,`userquizid`,`userid`,`answerflag` ,`last_date_added`) VALUES ('$I','$sub_sub_categoryid','$wishlistid','$userid','0',NOW())"); 
        } 
    } else { 
        $qryins = $m->executeQuery("INSERT INTO `tbl_user_score`(`userid`,`subjectid`,`time`,`date`,`correctans`,`incorrectans`,`score`,`categoryid`,`sub_sub_categoryid`) VALUES ('$userid','$subjectid','$time','$date','$correctans','$incorrectans','$score','$sub_categoryid','$sub_sub_categoryid')"); 
        foreach ($correct_array as $C) { 
            $qryins_correct = $m->executeQuery("INSERT INTO `tbl_user_quize_report`(`qnid`,`quizeid`,`userquizid`,`userid`,`answerflag` ,`last_date_added`) VALUES ('$C','$sub_sub_categoryid','$wishlistid','$userid','1',NOW())"); 
        } 
        foreach ($incorrect_array as $I) { 
            $qryins_incorrect = $m->executeQuery("INSERT INTO `tbl_user_quize_report`(`qnid`,`quizeid`,`userquizid`,`userid`,`answerflag` ,`last_date_added`) VALUES ('$I','$sub_sub_categoryid','$wishlistid','$userid','0',NOW())"); 
        } 
    } 
    if($qryins) { 
        $response["Score"] = array(); 
        { 
            $rows = array(); 
            $rows["UserId"] = $appuserid; 
            $rows["nameid"] = $subjectname; 
            $rows["Correct"] = (int)$correctans; 
            $rows["totalpoints"] = $totalpoints; 
            $rows["score"] = $score; 
            $rows["Size"] = (int)$totalqns; 
            array_push($response["Score"], $rows); 
        } 
        echo json_encode($response); 
    } else { 
        echo "Error!".mysqli_error($m->con); 
    } 
} 
?>

内容的提问来源于stack exchange,提问作者Bharat More

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:02:01