PHP实现手机号注册功能完整代码指南
在Web应用开发中,手机号注册是最常见的用户注册方式之一,本文将详细介绍如何使用PHP实现手机号注册功能,包括前端表单设计、后端数据校验、数据库存储及安全防护等完整流程,并提供可直接运行的代码示例。
准备工作:环境与数据库设计
开发环境
确保本地已安装以下环境:
- PHP 7.0+(推荐PHP 7.4+)
- MySQL 5.6+
- Web服务器(如Apache/Nginx)
- 手机号验证工具(如阿里云短信服务,可选)
数据库设计
创建用户表(users
),存储用户手机号及密码等基本信息:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(11) NOT NULL COMMENT '手机号', `password` varchar(255) NOT NULL COMMENT '加密密码', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_phone` (`phone`) -- 手机号唯一索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
前端注册页面(HTML+CSS)
创建register.html
,包含手机号输入、密码输入、验证码输入及提交按钮:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">手机号注册</title> <style> body { font-family: Arial, sans-serif; background: #f5f5f5; } .container { max-width: 400px; margin: 50px auto; padding: 20px; background: white; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .form-group { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type="text"], input[type="password"] { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 3px; box-sizing: border-box; } button { width: 100%; padding: 10px; background: #007bff; color: white; border: none; border-radius: 3px; cursor: pointer; font-size: 16px; } button:hover { background: #0056b3; } .error { color: red; font-size: 12px; margin-top: 5px; display: none; } </style> </head> <body> <div class="container"> <h2>手机号注册</h2> <form id="registerForm" action="register.php" method="post"> <div class="form-group"> <label for="phone">手机号:</label> <input type="text" id="phone" name="phone" placeholder="请输入11位手机号" maxlength="11"> <div id="phoneError" class="error">请输入正确的手机号</div> </div> <div class="form-group"> <label for="password">密码:</label> <input type="password" id="password" name="password" placeholder="请输入密码(至少6位)"> <div id="passwordError" class="error">密码至少6位</div> </div> <div class="form-group"> <label for="verify_code">验证码:</label> <input type="text" id="verify_code" name="verify_code" placeholder="请输入短信验证码" maxlength="6"> <button type="button" id="sendCodeBtn" onclick="sendCode()">获取验证码</button> <div id="codeError" class="error">验证码错误</div> </div> <button type="submit">注册</button> </form> </div> <script> // 简单的前端校验 document.getElementById('registerForm').onsubmit = function() { const phone = document.getElementById('phone').value; const password = document.getElementById('password').value; const code = document.getElementById('verify_code').value; let isValid = true; // 手机号校验(11位,1开头) if (!/^1[3-9]\d{9}$/.test(phone)) { document.getElementById('phoneError').style.display = 'block'; isValid = false; } else { document.getElementById('phoneError').style.display = 'none'; } // 密码校验(至少6位) if (password.length < 6) { document.getElementById('passwordError').style.display = 'block'; isValid = false; } else { document.getElementById('passwordError').style.display = 'none'; } // 验证码校验(非空,示例:简单判断,实际需与后端比对) if (!code || code.length !== 6) { document.getElementById('codeError').style.display = 'block'; isValid = false; } else { document.getElementById('codeError').style.display = 'none'; } return isValid; }; // 发送验证码(模拟,实际需调用短信接口) function sendCode() { const phone = document.getElementById('phone').value; if (!/^1[3-9]\d{9}$/.test(phone)) { alert('请先输入正确的手机号'); return; } // 模拟发送验证码(实际项目中调用阿里云/腾讯云短信API) const code = Math.floor(100000 + Math.random() * 900000).toString(); localStorage.setItem('verify_code_' + phone, code); // 存储到localStorage(仅演示) // 倒计时60秒 const btn = document.getElementById('sendCodeBtn'); btn.disabled = true; let countdown = 60; const timer = setInterval(() => { btn.textContent = `重新发送(${countdown}s)`; countdown--; if (countdown < 0) { clearInterval(timer); btn.disabled = false; btn.textContent = '获取验证码'; } }, 1000); alert(`验证码已发送(模拟):${code}`); // 实际项目中需删除此行 } </script> </body> </html>
后端注册逻辑(PHP)
创建register.php
,处理前端提交的注册数据,包括数据校验、密码加密、数据库存储及安全防护。
核心代码实现
<?php header('Content-Type: application/json; charset=utf-8'); // 数据库配置(实际项目中建议使用配置文件或环境变量) define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASS', 'your_password'); define('DB_NAME', 'your_database'); // 连接数据库 $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); if ($conn->connect_error) { die(json_encode(['code' => 500, 'msg' => '数据库连接失败:' . $conn->connect_error])); } $conn->set_charset('utf8mb4'); // 获取前端提交的数据 $phone = trim($_POST['phone'] ?? ''); $password = trim($_POST['password'] ?? ''); $verifyCode = trim($_POST['verify_code'] ?? ''); // 1. 校验手机号格式 if (!preg_match('/^1[3-9]\d{9}$/', $phone)) { echo json_encode(['code' => 400, 'msg' => '手机号格式不正确']); exit; } // 2. 校验密码强度(至少6位,包含字母和数字) if (strlen($password) < 6 || !preg_match('/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/', $password)) { echo json_encode(['code' => 400, 'msg' => '密码至少6位,且包含字母和数字']); exit; } // 3. 校验验证码(示例:从localStorage获取,实际需调用短信服务接口) $storedCode = $_SESSION['verify_code_' . $phone] ?? ''; // 实际项目中应从缓存或数据库获取 if (!$verifyCode || $verifyCode !== $storedCode) { echo json_encode(['code' => 400, 'msg' => '验证码错误或已过期']); exit; } // 4. 检查手机号是否已注册 $stmt = $conn->prepare("SELECT id FROM users WHERE phone = ?"); $stmt->bind_param("s", $phone); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { echo json_encode(['code' =>
还没有评论,来说两句吧...