在某个深夜,我坐在电脑前,面对着一堆PHP代码,突然意识到我需要一个报名系统。是的,你没听错,我需要一个报名系统。不是因为我想搞什么大型活动,而是因为我想知道有多少人愿意在我无聊的时候陪我一起讨论技术问题。于是,我决定自己动手,用PHP打造一个开源报名系统。
系统需求分析
我需要明确这个报名系统的基本功能。用户需要能够注册、登录,然后报名参加某个活动。管理员需要能够管理用户和活动信息。听起来很简单,对?但别忘了,我是个程序员,简单的事情也能搞复杂。
数据库设计
我决定使用MySQL作为数据库。先来设计一下表结构。
users表:存储用户信息,包括用户名、密码、邮箱等。
字段:id, username, password, email, created_at
events表:存储活动信息,包括活动名称、描述、开始时间、结束时间等。
字段:id, name, description, start_time, end_time
registrations表:存储用户报名信息,包括用户ID和活动ID。
字段:id, user_id, event_id, registered_at
大概就是这样,具体SQL语句我就不写了,你们懂的。
用户注册与登录
用户注册和登录是系统的基础功能,我决定先搞定这部分。为了安全起见,我使用了PHP的password_hash()和password_verify()函数来加密和验证密码。
注册页面代码如下:
form action="register.php" method="post"
input type="text" name="username" placeholder="Username" required
input type="password" name="password" placeholder="Password" required
input type="email" name="email" placeholder="Email" required
button type="submit"Submit/button
登录页面代码类似,我就不多写了。
处理注册的逻辑代码大致如下:
$username = $_POST['username'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$email = $_POST['email'];
$sql = "INSERT INTO users (username, password, email, created_at) VALUES (:username, :password, :email, NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute(['username' =$username, 'password' =$password, 'email' =$email]);
登录逻辑代码类似,只是需要验证密码:
$stmt = $pdo-$prepare("SELECT FROM users WHERE username = :username");
$stmt-execute(['username' =$username]);
$user = $stmt-fetch();
if ($user && password_verify($_POST['password'], $user['password'])) {
// 登录成功
} else {
// 登录失败
}
报名功能实现
接下来是报名功能。用户在登录后,可以看到所有活动,并选择报名。
展示活动列表的代码:
$sql = "SELECT FROM events WHERE end_time NOW()";
$stmt = $pdo-$prepare($sql);
$stmt-execute();
$events = $stmt-fetchAll();
foreach ($events as $event) {
echo div
h2$event['name']/h2
p$event['description']/p
form action="register_event.php" method="post"
input type="hidden" name="event_id" value="$event['id']"
button type="submit"Register/button
/div;
}
处理报名的逻辑代码:
$user_id = $_SESSION['user_id'];
$event_id = $_POST['event_id'];
$sql = "INSERT INTO registrations (user_id, event_id, registered_at) VALUES (:user_id, :event_id, NOW())";
$stmt-execute(['user_id' =$user_id, 'event_id' =$event_id]);
管理员功能
作为系统的管理者,我需要能够管理用户和活动。这部分功能我放在了后台管理系统中。
管理用户的代码:
$sql = "SELECT * FROM users";
$users = $stmt-fetchAll();
foreach ($users as $user) {
h2$user['username']/h2
p$user['email']/p
a href="delete_user.php?id=$user['id']"Delete/a
}
管理活动的代码类似,我就不多写了。
遇到的问题与解决
在实际开发过程中,我遇到了几个小问题,这里分享一下。
1. SQL注入:刚开始我没有使用预处理语句,导致SQL注入风险。后来我改用了PDO和预处理语句,问题解决。
2. 密码泄露:最初我直接把密码存储为明文,这显然不安全。后来我使用了password_hash()和password_verify(),提高了安全性。
3. 时间处理:在处理活动时间时,我忘记了时区的问题,导致活动时间显示不准确。后来我使用了PHP的DateTime类,指定了时区,问题解决。
总结
通过这个项目,我学到了很多。PHP虽然是个老牌语言,但在实际开发中,依然有很多需要注意的细节。从数据库设计到前端展示,再到安全性和性能优化,每一步都需要认真对待。
这个报名系统虽然简单,但它完全是我自己动手开发的结果。希望我的分享能对你们有所帮助。如果你们有兴趣,可以去我的GitHub仓库查看完整的代码。欢迎大家一起交流学习。