我有一个PHP Mysql应用程序。
在我的用户表中,我有用于登录的用户名列。出于某种原因,我应该保持所有用户名永远不变。如果用户想要更改它,我应该保存新用户名并将其映射到原始用户名。
这个senario的最佳实现是什么?
实施登录的最佳方式是什么?
答案 0 :(得分:1)
嗯,在后端......用户名不重要。您应该引用他们的UserID表ID。如果用户更改了用户名。最简单的实现方法是创建用户别名表。因此,当他们创建用户名时,您可以添加他们的"用户名"作为别名......例子。如果您创建此映射,则您将始终执行短期数据库烹饪。让用户自助服务总是比创造摩擦更容易。
Users
Id UserName email pwhash salt
------ ----------- -------------------- ---------------- ----------
1 superjoe joseschmoe@gmail.com supersecretstuff moresecretstuff
Aliases
Id UsersID UserAlias datemodified
------ ------- ---------- -------------------
1 1 joeschmoe 2016-01-13 20:59:59
2 1 superjoe 2016-06-10 10:01:36
因此,您只需在PHP端使用一些语句来创建新用户,也可以重命名用户。
创建新帐户:(使用bind_param作为?)
INSERT INTO users (username, email, password, salt) VALUES (?, ?, ?, ?)
INSERT INTO aliases (userid, usersalias) SELECT id, username FROM users
WHERE username = '?';
更新新用户名:
/* Assuming you keep the userid in a variable in php.
* otherwise you will need to use a Select Statement to get the userid
* or just use the username.
*/
UPDATE USERS SET Username='?' WHERE userid = '?';
INSERT INTO aliases (userid, usersalias) SELECT id, username FROM users
WHERE username = '?';
用户可以在自己的用户个人资料页面上进行自我管理或其他事情。
这里是我在php中使用的bind_param方法。因此,您需要在后端的某个地方使用$ mysqli作为包含声明,因此您不必将其放在每个页面上。只需include_once,你就可以在php页面的任何地方使用它。
define("HOST", "hostname");
define("USER", "dbuser");
define("PASSWORD", "supersecret");
define("DATABASE", "mydatabase");
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
if ( $mysqli->connect_error ) {
die('Connect Error: ' . $mysqli->connect_error);
}
if ($insert_stmt = $mysqli->prepare("INSERT INTO users (username, email, pwhash, salt) VALUES (?, ?, ?, ?)")) {
// Bind PHP Variables to the query.
// ssss implies - string for each binded parameter
// ssd for example would be string, string, decimal
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
header('Location: ../errorpage.php');
}
}
header('Location: ./successpage.php);
答案 1 :(得分:0)
对于“新名称到旧名称”的映射:最简单的方法是只记录旧名称,然后更新用户表中的用户名:
您只需使用userId,username,changeDate列创建一个新表“usernameHistory”。
因此,当用户更改其名称时,您只需将旧名称插入此表并更改用户表中的名称(使用事务,以便在出现错误时能够回滚)。
这适合您的问题吗?还有其他解决方案,但这取决于您的用例。我真的希望这个适合你,其他一切都可能变得凌乱我想。
其他方式:
如果您真的必须将用户的数据集保持在其原始状态,则必须将新用户名作为新数据集插入。
然后查询旧用户名的id并更新EVERY表,其中id用于构建用户与其他实体之间的关系。 (执行此操作时不要忘记使用事务,以便在出现问题时可以回滚)
如果您没有该用户的用户名以外的标识符,则必须触摸处理关系所涉及的每个表,以添加用户标识作为标识符。
此外,您应该在用户表中添加一个列,您可以在该表中标记数据集是否处于活动状态,因此用户无法使用旧名称登录。
答案 2 :(得分:0)
再创建一个新表,其中包含3个重要列parent_user_id,username,created。其中parent_user_id指用户主要ID和用户名是指可添加的多个用户名。 简而言之,您需要创建1:m映射。 为了更加轻松,您可以在新表中添加in_use列,这在许多情况下会使您受益。