我想实现一个注册的功能,主要包含两个需求:
1、用邮箱注册,能够实时检验是否符合邮箱的书写要求;
2、在输入的时候,实时检验用户名是否可用;
3、注册成功后,显示注册成功,并在2秒内跳转到登录页面;
以下是我的两个页面代码:
第一个:register.php
<?php
session_start();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once '../connections/games.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册页面</title>
</head>
<body class="body">
<div class="register">
<div class="title">
</div>
<div id="username-status" style="color:#d10000"></div>
<div>
<form action="register.php" method="post">
<table>
<tr>
<td style="text-align:right"><label for="username">邮箱:</label></td>
<td><input type="text" id="username" name="username"
pattern="[A-Za-z0-9@._-]+"
title="请输入有效的用户名(只包含英文字母(含大小写)、数字、“@”、“.”、“_”、“-”)"
placeholder="请输入一个邮箱" required></td>
</tr>
<tr style="height:10px">
<td></td>
<td style="padding:0px"><p style="font-size:8px">请输入有效的用户名<br>(仅包含英文字母(含大小写)、数字、“@”、“.”、“_”、“-”)</p></td>
</tr>
<tr>
<td style="text-align:right"><label for="password">密码:</label></td>
<td><input type="password" id="password" name="password"
pattern="[A-Za-z0-9@._]+"
title="请输入有效的用户名(只包含英文字母(含大小写)、数字、“@”、“.”、“_”)"
required></td>
</tr>
<tr style="height:10px">
<td></td>
<td style="padding:0px"><p style="font-size:8px">请输入有效的密码<br>(仅包含英文字母(含大小写)、数字、“@”、“.”、“_”)</p></td>
</tr>
<tr>
<td style="text-align:right"><label for="captcha">验证码:</label></td>
<td><input type="text" id="captcha" name="captcha" style="width:60px" required>
<img src="captcha.php" style="height:22px" >
</td>
</tr>
<tr>
<td></td>
<td style="font-size:16px"><input Class="button2" type="submit" value="注册"><?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['captcha'] !== $_SESSION['captcha']) {
die('请输入验证码');
}
?></td>
</tr>
</table>
</form>
</div>
</div>
</body>
<script>
document.addEventListener('DOMContentLoaded', function() {
var input = document.getElementById('username');
var statusDiv = document.getElementById('username-status');
input.addEventListener('input', function() {
var username = this.value;
if (username.trim() !== '') {
// 清除之前的错误信息(如果有的话)
statusDiv.textContent = '';
// 调用 checkUsername 函数来检查用户名
checkUsername(username);
}
});
});
function checkUsername(username) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'check_username.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
if (response.status === 'error') {
// 显示错误信息
document.getElementById('username-status').textContent = response.message;
} else if (response.status === 'success') {
// 用户名可用,可以清空或显示其他信息
document.getElementById('username-status').textContent = '';
}
} else {
// 处理请求错误
alert('请求失败,请稍后再试!');
}
};
xhr.onerror = function() {
// 处理网络错误
alert('网络错误,请检查您的网络连接!');
};
// 发送请求
xhr.send('username=' + encodeURIComponent(username));
}
</script>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
// 使用password_hash()函数生成密码的哈希值
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO user (`username`, `password`, `regtime`) VALUES (?, ?, NOW())");
$stmt->execute([$username, $hashedPassword]);
$pdo->commit();
if ($stmt->rowCount() > 0) {
echo '注册成功!';
} else {
echo '注册失败,但SQL执行没有错误。请检查数据库约束或重试。';
}
} catch (PDOException $e) {
$pdo->rollBack();
echo '数据库错误:' . $e->getMessage();
}
}
?>
</html>
第二个页面:check_username.php
<?php
session_start();
// 设置错误报告和显示错误
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 引入PDO连接文件
require_once '../connections/games.php';
// 检查是否通过POST方法发送了username
if (isset($_POST['username'])) {
$username = $_POST['username'];
// 检查用户名是否已存在
$stmt = $pdo->prepare('SELECT COUNT(*) FROM user WHERE username = :username');
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->execute();
$count = $stmt->fetchColumn();
if ($count > 0) {
echo json_encode(['status' => 'error', 'message' => '用户名已被占用!']);
} else {
echo json_encode(['status' => 'success', 'message' => '用户名可用!']);
}
if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
echo json_encode(['status' => 'error', 'message' => '这不是一个有效的邮箱地址!']);
exit;
} else {
echo json_encode(['status' => 'error', 'message' => '邮箱可用']);
}
}
?>