
本文详细讲解如何在完成 steam openid 认证后,提取用户唯一 steamid64、昵称等关键信息,并通过 pdo 安全写入 mysql 数据库,适合 php 初学者快速上手。
本文详细讲解如何在完成 steam openid 认证后,提取用户唯一 steamid64、昵称等关键信息,并通过 pdo 安全写入 mysql 数据库,适合 php 初学者快速上手。
Steam OpenID 登录成功后,系统会重定向回你的回调地址(如 login.php),并附带 $_GET['openid_claimed_id'] 参数——该值即为用户的唯一 SteamID64(形如 https://steamcommunity.com/openid/id/76561198012345678)。你需要从中提取纯数字 ID,并可选地调用 Steam Web API 获取用户名、头像等公开信息,再持久化存储至 MySQL。
✅ 第一步:提取 SteamID64 并验证格式
使用正则安全提取 17 位纯数字 ID(注意:SteamID64 是 64 位无符号整数,PHP 中需用字符串处理避免溢出):
$claimed_id = $_GET['openid_claimed_id'] ?? '';
if (preg_match('#^https://steamcommunity\.com/openid/id/(\d+)$#', $claimed_id, $matches)) {
$steamID64 = $matches[1]; // 如 '76561198012345678'
} else {
die('Invalid Steam OpenID response.');
}
✅ 第二步:连接 MySQL(推荐 PDO + 预处理语句)
创建 config.php 配置数据库连接,启用异常模式与预处理,杜绝 SQL 注入:
<?php try {
$pdo = new PDO('mysql:host=localhost;dbname=csgo_league;charset=utf8mb4', 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
die('Database connection failed: ' . $e->getMessage());
}
✅ 第三步:插入基础用户数据(SteamID64 + 时间戳)
即使暂不获取昵称,也应先保存唯一标识以支持后续登录:
$stmt = $pdo->prepare("INSERT INTO users (steamid64, created_at) VALUES (?, NOW()) ON DUPLICATE KEY UPDATE last_login = NOW()");
$stmt->execute([$steamID64]);
⚠️ 注意:确保
users表中steamid64字段为VARCHAR(25)(非 INT)并设为UNIQUE KEY,因 64 位整数超出 PHPint范围且 MySQLBIGINT UNSIGNED在某些旧版本存在兼容风险。
✅ 第四步(进阶):调用 Steam API 获取用户名与头像
使用 file_get_contents() 或 cURL 请求 ISteamUser.GetPlayerSummaries,需申请免费 API Key(https://www.php.cn/link/2f4ce765370963b46cc97175da3eae88):
$apiKey = 'YOUR_STEAM_API_KEY';
$url = "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/?key={$apiKey}&steamids={$steamID64}";
$response = file_get_contents($url);
$data = json_decode($response, true);
if (!empty($data['response']['players'][0])) {
$player = $data['response']['players'][0];
$username = $player['personaname'] ?? '';
$avatar = $player['avatarfull'] ?? '';
$stmt = $pdo->prepare("UPDATE users SET username = ?, avatar_url = ? WHERE steamid64 = ?");
$stmt->execute([$username, $avatar, $steamID64]);
}
? 安全与最佳实践提醒
- 永远不要直接拼接
$_GET参数到 SQL;始终使用 PDO 预处理。 - Steam API 响应可能失败(网络超时、限流、用户隐私设置),务必添加
isset()和空值判断。 - 生产环境建议添加日志记录(如
error_log("Steam login: {$steamID64}"))便于排查。 - 后续扩展可加入
is_banned、last_seen等字段,支撑联赛管理功能。
至此,你已构建起安全、可扩展的 Steam 用户数据入库流程——既满足入门需求,也为后续开发(如权限系统、战绩绑定)打下坚实基础。











