PHP实现手机号注册功能代码详解
在Web应用开发中,手机号注册是最常见的用户注册方式之一,本文将详细介绍如何使用PHP实现手机号注册功能,包括表单设计、后端验证、数据库存储及安全防护等核心环节,并提供完整的代码示例。
核心功能流程
手机号注册的基本流程如下:
- 前端表单:用户输入手机号、密码(及确认密码)、验证码等信息。
- 后端验证:接收前端数据,验证手机号格式、密码强度、验证码有效性等。
- 数据库存储:验证通过后,将用户信息加密存储到数据库(密码需加密)。
- 结果反馈:向前端返回注册成功或失败的提示。
数据库设计
首先需要设计用户表(users),存储用户信息,以MySQL为例,创建表的SQL如下:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(20) 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 `uk_phone` (`phone`) -- 手机号唯一,防止重复注册 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
前端注册表单(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; }
.register-container { max-width: 400px; margin: 50px auto; padding: 20px; background: white; border-radius: 5px; box-shadow: 0 2px 10px 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: 10px; 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: 14px; margin-top: 5px; display: none; }
</style>
</head>
<body>
<div class="register-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位手机号" required>
<div id="phoneError" class="error">手机号格式不正确</div>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" placeholder="请输入密码(至少6位)" required>
<div id="passwordError" class="error">密码至少6位</div>
</div>
<div class="form-group">
<label for="confirm_password">确认密码:</label>
<input type="password" id="confirm_password" name="confirm_password" placeholder="请再次输入密码" required>
<div id="confirmPasswordError" class="error">两次密码不一致</div>
</div>
<div class="form-group">
<label for="verify_code">验证码:</label>
<input type="text" id="verify_code" name="verify_code" placeholder="请输入验证码" required>
<button type="button" id="sendVerifyCode" style="width: auto; margin-top: 5px;">发送验证码</button>
<div id="verifyCodeError" class="error">验证码错误或已过期</div>
</div>
<button type="submit">注册</button>
</form>
</div>
<script>
// 简单的前端验证(实际项目中需结合后端验证)
document.getElementById('registerForm').addEventListener('submit', function(e) {
const phone = document.getElementById('phone').value;
const password = document.getElementById('password').value;
const confirmPassword = document.getElementById('confirm_password').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';
}
// 验证密码
if (password.length < 6) {
document.getElementById('passwordError').style.display = 'block';
isValid = false;
} else {
document.getElementById('passwordError').style.display = 'none';
}
// 验证两次密码
if (password !== confirmPassword) {
document.getElementById('confirmPasswordError').style.display = 'block';
isValid = false;
} else {
document.getElementById('confirmPasswordError').style.display = 'none';
}
if (!isValid) {
e.preventDefault();
}
});
// 发送验证码(模拟,实际需调用短信接口)
document.getElementById('sendVerifyCode').addEventListener('click', function() {
const phone = document.getElementById('phone').value;
if (!/^1[3-9]\d{9}$/.test(phone)) {
alert('请先输入正确的手机号');
return;
}
// 这里模拟发送验证码,实际项目中需调用短信服务商API(如阿里云短信、腾讯云短信)
// 假设验证码为"123456",有效期5分钟
localStorage.setItem('verify_code_' + phone, '123456');
localStorage.setItem('verify_code_expire_' + phone, Date.now() + 5 * 60 * 1000);
alert('验证码已发送(模拟:123456)');
});
</script>
</body>
</html>
后端注册处理(PHP)
创建register.php,处理前端提交的注册数据,包括验证、数据库存储等逻辑:
<?php
header('Content-Type: application/json; charset=utf-8');
// 连接数据库(请替换为实际数据库配置)
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = 'root';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die(json_encode(['code' => 500, 'msg' => '数据库连接失败:' . $e->getMessage()]));
}
// 接收前端数据
$phone = trim($_POST['phone'] ?? '');
$password = trim($_POST['password'] ?? '');
$confirmPassword = trim($_POST['confirm_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) {
echo json_encode(['code' => 400, 'msg' => '密码至少6位']);
exit;
}
// 3. 验证两次密码是否一致
if ($password !== $confirmPassword) {
echo json_encode(['code' => 400, 'msg' => '两次密码不一致']);
exit;
}
// 4. 验证验证码(模拟验证,实际需结合短信接口)
$storedCode = localStorage.getItem('verify_code_' . $phone);
$storedExpire = localStorage.getItem('verify_code_expire_' . $phone);
if (!$storedCode || $verifyCode !== $storedCode || time() * 1000 > $storedExpire) {
echo json_encode(['code' => 400, 'msg' => '验证码错误或已过期']);
exit;
}
// 5. 检查手机号是否已注册
try {
$stmt = $


还没有评论,来说两句吧...