Postman向PHP发送POST请求提示字段为空问题排查
问题原因
字段为空的提示是后端PHP代码逻辑顺序写反导致的,和Postman配置无关:
- 代码先执行
isset($username)/isset($password)/isset($email)判断,但这三个变量在判断节点还未被赋值(赋值代码写在了判断逻辑后面),所以无论Postman传什么值,判断结果永远是变量不存在,直接返回字段为空的提示。 - 代码里还藏了两个会导致后续执行报错的问题:
- 数据库插入SQL写了4个占位符(对应
userID/username/email/password四个字段),但bind_param只绑定了3个变量,类型声明也只写了3个s,就算过了非空判断插入也会失败 - 数据库连接失败的判断逻辑写法错误:
mysqli_connect连接失败时返回布尔值false,不是对象,直接用$con->connect_error会触发语法报错
- 数据库插入SQL写了4个占位符(对应
修复方案
- 调整代码顺序:先判断$_POST里的字段是否存在、从$_POST中取参数,再执行后续业务逻辑
- 修正数据库相关语法错误:如果
userID是自增主键,插入时不需要手动传该字段,避免参数数量不匹配问题 - 修复后的完整后端代码如下:
<?php include_once 'creds.php'; $con = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); // 修正连接错误判断写法 if(mysqli_connect_errno()){ echo "Failed connecting to database".mysqli_connect_errno(); exit; } else { echo "Success connecting\n"; } //Register User if($_SERVER['REQUEST_METHOD'] == 'POST'){ // 先判断POST字段是否存在、是否为空 if(!isset($_POST['username']) || trim($_POST['username']) === ''){ echo "Username field cannot be empty\n"; return; } if(!isset($_POST['password']) || trim($_POST['password']) === ''){ echo "password field cannot be empty\n"; return; } if(!isset($_POST['email']) || trim($_POST['email']) === ''){ echo "Email field cannot be empty\n"; return; } // 校验通过后再取值 $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; // 修正SQL:自增主键userID不需要手动插入,占位符和参数数量保持3个匹配 $stmt = $con->prepare("INSERT INTO `shop`(`username`, `email`, `password`) VALUES (?,?,?)"); // 修正参数绑定:3个字符串类型,参数顺序和SQL字段顺序一一对应 $stmt->bind_param("sss",$username,$email,$password); if($stmt->execute()){ echo "Succesfully Registered"; } else { echo "Failure\n".mysqli_error($con); } } ?>
Postman配置说明
你当前的Postman配置如下图所示,使用form-data格式传参符合PHP$_POST的读取规则,替换上述修复后的代码即可正常请求,不需要调整Postman参数配置。
额外提醒:正式环境不要明文存储密码,建议使用
password_hash()处理后再存入数据库。
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

