表单已填写却仍抛出错误?PHP注册页表单校验异常问题求助
问题排查
- 缺少POST参数赋值步骤:脚本中直接使用的
$fname、$lname、$email等变量未从$_POST超全局中取值,属于未定义变量,即使表单提交成功也无法拿到实际内容。 - 预处理参数绑定错误:
- 类型声明长度不匹配:5个待绑定参数仅声明了
"ss"2个字符串类型,和参数数量不符。 - 参数顺序错位:INSERT语句的字段顺序为
fname、lname、email、mobile_number、password,绑定的参数顺序完全不匹配,即使执行成功也会出现字段存错数据的问题。
- 类型声明长度不匹配:5个待绑定参数仅声明了
- 逻辑缺失:未校验
password和confirm_password的一致性,会导致用户两次输入密码不一致也能注册的问题。 - 语法错误:PHP代码末尾有孤立的
*/注释结束符,无对应开头注释会触发语法报错。 - 校验逻辑缺陷:
isset仅判断参数是否存在,空字符串也会返回true,前端required属性可被绕过,建议补充内容非空校验。
修正后的PHP代码
<?php session_start(); require_once "config.php"; // 校验表单参数是否存在且非空 if ( empty($_POST['fname']) || empty($_POST['lname']) || empty($_POST['email']) || empty($_POST['mobile_number']) || empty($_POST['password']) || empty($_POST['confirm_password']) ) { exit ('Please fill in all fields.'); } // 赋值变量 $fname = trim($_POST['fname']); $lname = trim($_POST['lname']); $email = trim($_POST['email']); $mobile_number = trim($_POST['mobile_number']); $password = $_POST['password']; $confirm_password = $_POST['confirm_password']; // 校验两次密码是否一致 if ($password !== $confirm_password) { exit ('两次输入的密码不一致,请重新输入'); } // 预处理SQL if ($stmt = $db->prepare('INSERT INTO accounts (fname, lname, email, mobile_number, password) VALUES (?, ?, ?, ?, ?)')) { // 5个参数均为字符串,类型声明为sssss,参数顺序和字段顺序保持一致 mysqli_stmt_bind_param($stmt, "sssss", $fname, $lname, $email, $mobile_number, password_hash($password, PASSWORD_DEFAULT)); if(mysqli_stmt_execute($stmt)) { // 重定向到登录页 header ("Location: index.php"); exit(); } else { echo "Oops! Something went wrong! Please try again later."; } mysqli_stmt_close($stmt); } ?>
内容的提问来源于stack exchange,提问作者monkeyduo
相关产品推荐
相关产品推荐

