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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:24:03