提供登入會員修改暱稱、密碼、性別的介面。採用彈出視窗模式,修改成功後自動關閉視窗,父視窗可透過 JS 同步更新顯示。
CREATE TABLE `chat_user` (
`userid` VARCHAR(30) PRIMARY KEY, -- 登入帳號(不可改)
`id` VARCHAR(30) NOT NULL, -- 顯示暱稱
`passwd` VARCHAR(30) NOT NULL,
`sex` ENUM('帥哥','妹妹') NOT NULL
);
CREATE TABLE `chat_user_list` (
`userid` VARCHAR(30) PRIMARY KEY,
`id` VARCHAR(30) NOT NULL,
`passwd` VARCHAR(30) NOT NULL,
`sex` ENUM('帥哥','妹妹') NOT NULL
-- 線上用戶列表,同步更新
);
<?php
// changenick.php
require_once "../signup/mysql.php"; // 包含資料庫連線 $conn
$userid = $_GET['userid'] ?? $_POST['userid'] ?? '';
$action = $_POST['action'] ?? '';
if ($action === 'ok') {
$new_nick = trim($_POST['nick'] ?? '');
$new_pass = trim($_POST['passwd'] ?? '');
$new_sex = $_POST['sex'] ?? '帥哥';
// 驗證暱稱唯一性(排除自己)
$stmt = $conn->prepare("SELECT userid FROM chat_user_list WHERE id = ? AND userid != ?");
$stmt->bind_param("ss", $new_nick, $userid);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
die("該暱稱已被使用,請換一個。<br><a href='javascript:history.back()'>返回</a>");
}
$stmt->close();
// 更新兩張表(建議用 Transaction)
$conn->begin_transaction();
try {
$stmt = $conn->prepare("UPDATE chat_user_list SET id=?, passwd=?, sex=? WHERE userid=?");
$stmt->bind_param("ssss", $new_nick, $new_pass, $new_sex, $userid);
$stmt->execute();
$stmt = $conn->prepare("UPDATE chat_user SET id=?, passwd=?, sex=? WHERE userid=?");
$stmt->bind_param("ssss", $new_nick, $new_pass, $new_sex, $userid);
$stmt->execute();
$conn->commit();
echo "<script>window.close();</script>"; // 關閉彈出視窗
exit;
} catch (Exception $e) {
$conn->rollback();
die("更新失敗:" . $e->getMessage());
}
}
?>
<!DOCTYPE html>
<html><head>
<meta charset="gb2312"><title>修改個人資料</title>
<style>
body { background:#fff; font:12px/1.5 sans-serif; }
.layer { position:absolute; }
#formLayer { left:144px; top:54px; width:126px; }
#bgLayer { left:40px; top:28px; width:293px; height:202px; background:#6699FF; }
label { display:block; margin:5px 0; }
input, select { width:100%; box-sizing:border-box; }
</style>
</head><body>
<div id="bgLayer" class="layer"></div>
<div id="formLayer" class="layer">
<form method="POST" action="?action=ok">
<input type="hidden" name="userid" value="<?php echo htmlspecialchars($userid); ?>">
<label>暱稱:<input name="nick" maxlength="20" required></label>
<label>密碼:<input name="passwd" type="password" maxlength="20" required></label>
<label>性別:
<select name="sex">
<option value="帥哥">帥哥</option>
<option value="妹妹">美眉</option>
</select>
</label>
<button type="submit">更改</button>
</form>
</div>
<div class="layer" style="left:72px; top:58px;">用戶暱稱</div>
<div class="layer" style="left:72px; top:99px;">用戶密碼</div>
<div class="layer" style="left:82px; top:139px;">性別</div>
</body></html>
| 技術點 | 說明 |
|---|---|
| 暱稱唯一性檢查 | UPDATE 前先查 chat_user_list,排除自己 userid != ? |
| 雙表同步更新 | chat_user(永久帳號)+ chat_user_list(線上列表) |
| 交易控制 | begin_transaction() / commit() / rollback() 確保一致性 |
| 彈出視窗關閉 | window.close() 修改成功後自動關閉 |
| 父視窗同步 | 父頁面可用 window.opener.location.reload() 或 JS 回呼更新顯示 |
| 編碼處理 | 頁面宣告 charset=gb2312,資料庫連線需對應 SET NAMES gbk |
password_hash() / password_verify()。token 隱藏欄位,伺服端驗證。maxlength。userid 屬於當前 Session 使用者,防止越權修改。PATCH /api/user/profile。