无法从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
相关产品推荐
相关产品推荐

