
本文介绍在同域名下多个动态网站共享单一 MySQL users 表的实践方案,通过统一数据库连接与标准化 CRUD 操作,实现用户注册/登录一次、全站通行,避免数据冗余与同步复杂度。
本文介绍在同域名下多个动态网站共享单一 mysql `users` 表的实践方案,通过统一数据库连接与标准化 crud 操作,实现用户注册/登录一次、全站通行,避免数据冗余与同步复杂度。
在实际开发中,当多个动态网站(如 site1.example.com 和 site2.example.com)部署在同一服务器或不同服务器,但需共用用户体系时,最简洁、可靠且符合数据库设计原则的方案是:统一用户数据源,而非同步多份副本。这意味着不维护两个独立的 users 表,而是只保留一个权威的 users 表,并让所有站点直连该表进行读写操作。
✅ 推荐架构:单库集中式用户管理
- 创建一个专用数据库(例如 shared_auth),其中仅包含核心用户表(如 users),字段应满足各站点通用需求(如 id, email, password_hash, created_at, last_login 等);
- 所有网站的 PHP 应用均配置指向该数据库的独立 MySQLi 或 PDO 连接;
- 各站点业务逻辑中,涉及用户注册、登录、信息查询等操作,全部使用该共享连接执行 SQL,而非操作本地数据库。
? 示例:PHP 中安全接入共享用户库
// config/shared_db.php —— 统一数据库配置(建议存于 Web 根目录外)
define('DB_HOST', 'localhost'); // 若跨服务器,需替换为公网IP或域名,并开放远程访问权限
define('DB_USER', 'auth_app_user');
define('DB_PASS', 'strong_password_here');
define('DB_NAME', 'shared_auth');
// init_shared_db.php —— 在各站点入口文件(如 index.php)顶部引入
$mysqliAuth = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqliAuth->connect_error) {
error_log("Shared DB connection failed: " . $mysqliAuth->connect_error);
die("服务暂时不可用,请稍后重试。");
}
$mysqliAuth->set_charset("utf8mb4"); // 强烈建议使用 utf8mb4 支持完整 Unicode(如 emoji)在用户注册逻辑中(以 site1 为例):
// site1/register.php
require_once 'init_shared_db.php';
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$password = password_hash($_POST['password'], PASSWORD_ARGON2ID);
$stmt = $mysqliAuth->prepare("INSERT INTO users (email, password_hash, created_at) VALUES (?, ?, NOW())");
$stmt->bind_param("ss", $email, $password);
if ($stmt->execute()) {
echo "注册成功!您现在可在 site1 和 site2 无缝登录。";
} else {
echo "注册失败:" . $stmt->error;
}
$stmt->close();同理,site2 的登录验证也直接查询同一张 users 表:
// site2/login.php
require_once 'init_shared_db.php';
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$stmt = $mysqliAuth->prepare("SELECT id, password_hash FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$user = $result->fetch_assoc();
if (password_verify($_POST['password'], $user['password_hash'])) {
session_start();
$_SESSION['user_id'] = $user['id'];
header("Location: /dashboard.php");
exit;
}
}
echo "邮箱或密码错误。";⚠️ 关键注意事项
- 权限最小化:数据库用户 auth_app_user 仅授予 shared_auth.users 表的 SELECT, INSERT, UPDATE 权限,禁止 DROP, DELETE, ALTER 等高危操作;
- 连接安全性:若网站跨服务器部署,MySQL 必须配置允许远程主机连接(修改 bind-address 和 mysql.user 表),并启用 SSL 连接(推荐);
- 避免命名冲突:各站点原有本地 users 表应停用或重命名(如 site1_users_bak),防止误操作;
- 扩展性考量:未来若需支持更多站点或增加字段(如 preferred_site),只需在共享表上 ALTER TABLE,无需修改各站点连接逻辑;
- 事务与并发:高并发注册场景下,建议对关键操作(如邮箱唯一性校验+插入)使用 INSERT ... ON DUPLICATE KEY UPDATE 或加唯一索引+异常捕获,保障数据一致性。
✅ 总结
共享用户表的本质不是“连接两张表”,而是消除冗余表、建立单一可信数据源。它比双写同步、定时 ETL 或消息队列方案更轻量、实时性更高、运维成本更低。只要合理设计表结构、严格控制数据库权限、规范连接与查询逻辑,即可稳健支撑多站点统一身份认证。此方案已在大量 SaaS 子应用、企业门户集群及多品牌站群中长期验证有效。

















