mysql - 将用户名映射到唯一标识符

时间:2016-06-10 06:17:29

标签: mysql

我有一个PHP Mysql应用程序。

在我的用户表中,我有用于登录的用户名列。出于某种原因,我应该保持所有用户名永远不变。如果用户想要更改它,我应该保存新用户名并将其映射到原始用户名。

这个senario的最佳实现是什么?

实施登录的最佳方式是什么?

3 个答案:

答案 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列,这在许多情况下会使您受益。