在运营多个动态网站时,最让人头疼的往往是用户需要在每个站分别注册。通过在两个动态网站间共享同一个 MySQL 用户表,我们可以实现单库多站的用户统一认证,让用户一次注册、多处登录。

一、为什么选择单库多站共享用户表
相比于部署独立的用户中心服务,直接共享 MySQL 用户表更加轻量。两个动态网站本身都已支持 PHP 与 MySQL,只需调整数据库连接和登录校验逻辑,就能复用同一批账号数据,降低开发和维护成本。
二、设计共用的用户表结构
建议在同一个 MySQL 实例中建立一张独立的用户表,例如 shared_users,供两个站点共同读写。基础字段设计如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT AUTO_INCREMENT | 用户主键 |
| username | VARCHAR(50) | 登录用户名 |
| password | VARCHAR(255) | 密码哈希值 |
| VARCHAR(100) | 邮箱 | |
| created_at | DATETIME | 注册时间 |
注意密码字段务必存储使用 password_hash() 生成的哈希,而非明文或弱加密。
三、两个站点连接同一数据库
在站点 A 与站点 B 的配置文件中,都指向同一个 MySQL 库及上面的 shared_users 表。示例如下:
<?php
// 站点公共数据库配置
$dbHost = '127.0.0.1';
$dbName = 'common_db';
$dbUser = 'app_user';
$dbPass = 'strong_password';
// 建立 PDO 连接
try {
$pdo = new PDO(
"mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4",
$dbUser,
$dbPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
?>
四、统一登录认证逻辑
两个网站的登录接口都应查询同一张表,并使用 password_verify() 校验密码。下面是一段通用的登录处理代码:
<?php
session_start();
require 'db_config.php';
$inputUser = $_POST['username'] ?? '';
$inputPass = $_POST['password'] ?? '';
// 查询共享用户表
$stmt = $pdo->prepare('SELECT id, username, password FROM shared_users WHERE username = ?');
$stmt->execute([$inputUser]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($inputPass, $user['password'])) {
// 认证成功,写入会话
$_SESSION['uid'] = $user['id'];
$_SESSION['user'] = $user['username'];
echo '登录成功';
} else {
echo '用户名或密码错误';
}
?>
五、会话与退出处理
由于两个站点域名可能不同,不能直接共享 Session 文件,但都基于同一用户表,可在各自站内置登录态。退出时调用 session_destroy() 清理本地会话即可。若后期需要跨域单点登录,可在此基础上增加令牌机制。
六、注意事项
- 两站必须使用一致的密码哈希算法,否则无法互相认证。
- 对用户名和邮箱建议加唯一索引,防止重复注册。
- 定期备份 shared_users 表,避免单点故障导致所有站点无法登录。
按照上述方式,两个动态网站便能稳妥地共享 MySQL 用户表,实现单库多站的用户统一认证。