PHP无法读取HTTP POST请求体,Flutter登录校验始终失败如何解决?
问题排查及解决方案
现有代码存在的问题
- 短标签兼容性问题:代码开头
<?依赖PHP短标签配置,未开启的环境下代码不会被解析,建议改为标准的<?php开头 - JSON解析后取值方式错误:
json_decode()默认返回object对象类型,你代码中直接用数组语法$obj['username']取值会抛出错误,导致后续逻辑无法执行 - SQL语法错误:查询语句中
andpassword没有加空格,应为and password,语法错误导致SQL执行失败,永远返回空结果 - 无错误校验逻辑:未校验JSON解析是否成功、SQL执行是否报错,无法定位问题根源
- 存在严重SQL注入风险:直接拼接用户输入到SQL语句中,会被恶意用户进行注入攻击,出现拖库甚至删库的风险
修正后的代码
<?php $con = include "conn.php"; // 校验请求格式是否为JSON $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; if (stripos($contentType, 'application/json') === false) { echo json_encode('请求格式必须为JSON'); exit; } $json = file_get_contents('php://input'); // 第二个参数设为true,将JSON解析为关联数组 $obj = json_decode($json, true); // 校验JSON解析是否成功、必填参数是否存在 if (json_last_error() !== JSON_ERROR_NONE || !isset($obj['username'], $obj['password'])) { echo json_encode('请求参数不合法'); exit; } $username = $obj['username']; $password = $obj['password']; // 使用预处理语句避免SQL注入 $stmt = mysqli_prepare($con, "SELECT * FROM user WHERE username = ? AND password = ? LIMIT 1"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $check = mysqli_stmt_get_result($stmt); $user = mysqli_fetch_array($check); if (!empty($user)) { echo json_encode('Login Matched'); } else { echo json_encode('Invalid Username or Password Please Try Again'); } mysqli_close($con); ?>
Postman测试注意事项
请求必须选择POST方法,Body选raw,格式选JSON,传入的JSON格式要符合规范,示例:
{ "username": "你的测试账号", "password": "你的测试密码" }
内容的提问来源于stack exchange,提问作者Reem
相关产品推荐
相关产品推荐

