PHP注册表单问题:点击按钮跳转至register_db.php且数据未入库
解决注册数据未存入数据库且页面不跳转问题
问题根源分析
- 数据未存入数据库:后端
register_db.php中判断提交动作的条件是isset($_POST['register']),但前端表单的提交按钮没有name="register"属性,导致后端永远不会执行注册逻辑。 - 页面跳转:表单默认采用同步提交方式,触发页面跳转,不符合无刷新需求。
分步解决方案
1. 修改前端register.php,实现无刷新提交
添加消息显示区域、表单标识,并编写AJAX提交逻辑:
<?php session_start(); require_once 'config/db.php'; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="styles.css" rel="stylesheet"> <title>register</title> </head> <body> <div class="background"> <div class="d-flex align-items-center min-vh-100"> <div class="container"> <div class="row justify-content-center"> <div class="col-lg-5"> <!-- 新增注册结果消息显示区 --> <div id="message-area" class="mb-3"></div> <div class="card shadow p-3 mb-5 bg-body rounded"> <div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel"> <div class="card-body"> <!-- 移除action属性,添加表单ID用于JS选择 --> <form id="register-form" method="POST"> <div class="mb-3"> <label for="username-form" class="form-label">Username</label> <input type="text" class="form-control" name="username" placeholder="Username" aria-describedby="username"> </div> <div class="mb-3"> <label for="password-form" class="form-label">Password</label> <input type="password" class="form-control" name="password" placeholder="Password"> </div> <div class="mb-3"> <label for="confirm-password-form" class="form-label">Confirm Password</label> <input type="password" class="form-control" name="confirm_password" placeholder="Confirm Password"> </div> <div class="d-grid gap-2"> <!-- 添加name属性,匹配后端判断条件 --> <button type="submit" name="register" class="btn btn-success">Register</button> </div> </form> </div> </div> </div> </div> </div> </div> </div> <script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script> // 监听表单提交事件,实现异步提交 document.getElementById('register-form').addEventListener('submit', async function(e) { e.preventDefault(); // 阻止默认页面跳转 // 收集表单数据 const formData = new FormData(this); try { // 发送POST请求到后端 const response = await fetch('register_db.php', { method: 'POST', body: formData }); const result = await response.json(); const messageArea = document.getElementById('message-area'); // 清空之前的消息 messageArea.innerHTML = ''; // 根据返回状态生成对应样式的提示框 let alertClass = ''; switch(result.status) { case 'success': alertClass = 'alert alert-success'; break; case 'warning': alertClass = 'alert alert-warning'; break; default: alertClass = 'alert alert-danger'; } const alertElement = document.createElement('div'); alertElement.className = alertClass; alertElement.innerHTML = result.message; messageArea.appendChild(alertElement); // 注册成功后清空表单 if (result.status === 'success') { this.reset(); } } catch (error) { console.error('提交失败:', error); messageArea.innerHTML = '<div class="alert alert-danger">网络异常,请稍后重试</div>'; } }); </script> </body> </html>
2. 修改后端register_db.php,返回JSON响应
移除跳转逻辑,改为返回JSON格式的处理结果:
<?php session_start(); require_once 'config/db.php'; // 设置响应为JSON格式 header('Content-Type: application/json'); $response = ['status' => 'error', 'message' => '无效请求']; if (isset($_POST['register'])) { $username = trim($_POST['username']); $password = trim($_POST['password']); $confirm_password = trim($_POST['confirm_password']); $urole = 'user'; if (empty($username)) { $response['message'] = 'กรุณากรอก Username'; } else if (empty($password)) { $response['message'] = 'กรุณากรอกรหัสผ่าน'; } else if (strlen($password) > 20 || strlen($password) < 8) { $response['message'] = 'รหัสผ่านต้องมีความยาวระหว่าง 8 ถึง 20 ตัวอักษร'; } else if (empty($confirm_password)) { $response['message'] = 'กรุณายืนยันรหัสผ่าน'; } else if ($password != $confirm_password) { $response['message'] = 'รหัสผ่านไม่ตรงกัน'; } else { try { // 检查用户名是否已存在 $check_username = $conn->prepare("SELECT username FROM users WHERE username = :username"); $check_username->bindParam(":username", $username); $check_username->execute(); $row = $check_username->fetch(PDO::FETCH_ASSOC); if ($row) { $response['status'] = 'warning'; $response['message'] = "ขื่อผู้ใช้นี้อยู่ในระบบแล้ว <a href='login.php' class='alert-link'>คลิ๊กที่นี่</a> เพื่อเข้าสู่ระบบ"; } else { // 插入新用户数据 $passwordHash = password_hash($password, PASSWORD_DEFAULT); $stmt = $conn->prepare("INSERT INTO users(username, password, urole) VALUES(:username, :password, :urole)"); $stmt->bindParam(":username", $username); $stmt->bindParam(":password", $passwordHash); $stmt->bindParam(":urole", $urole); $stmt->execute(); $response['status'] = 'success'; $response['message'] = "สมัครสมาชิกเรียบร้อยแล้ว! <a href='login.php' class='alert-link'>คลิ๊กที่นี่</a> เพื่อเข้าสู่ระบบ"; } } catch(PDOException $e) { $response['message'] = "มีบางอย่างผิดพลาด: " . $e->getMessage(); } } } // 返回JSON格式结果 echo json_encode($response); exit(); ?>
修改关键点总结
- 前端:
- 给提交按钮添加
name="register",匹配后端判断条件; - 用
fetch API实现异步提交,阻止默认跳转; - 新增消息区域,动态显示注册结果。
- 给提交按钮添加
- 后端:
- 移除所有页面跳转逻辑,改为返回JSON响应;
- 优化用户名存在性检查逻辑,避免未定义索引错误;
- 对输入参数做
trim()处理,避免空字符干扰验证。
内容的提问来源于stack exchange,提问作者OZETSU
相关产品推荐
相关产品推荐

