当前位置: 首页 > 知识库问答 >
问题:

如何在php/mysql上防止重复用户名?[副本]

狄赞
2023-03-14

是的,在你告诉我将用户名列设置为主键之前,所以不允许重复。我已经在为我的user_id使用主键,它是自动增量的。我希望能够在PHP中进行检查,看看用户名是否已经被取走,并将json_encode发送回我的应用程序。顺便说一句,数据库是托管在线,所以不是真的localhost!

这是我现在使用的,不起作用:

<?php
    $con = mysqli_connect("localhost", "id177667_root", "***", "id177667_loginb");
    $name = $_POST["name"];
    $username = $_POST["username"];
    $password = $_POST["password"];
    $response = array();
    $dup = mysqli_query($con, "SELECT * FROM user WHERE username=$username");
    if(mysqli_num_rows($dup) > 0) {
        $response["success"] = false;
    }
    else {
        $statement = mysqli_prepare($con, "INSERT INTO user (name, username, password) VALUES (?, ?, ?)");
        mysqli_stmt_bind_param($statement, "sss", $name, $username, $password);
        mysqli_stmt_execute($statement);
        $response["success"] = true;
    }
    echo json_encode($response);
?>

当我运行这个的托管链接时,我得到成功:true,但它应该是false:

<?php
    $con = mysqli_connect("localhost", "id177667_root", "***", "id177667_loginb");
    $name = $_POST["name"];
    $username = $_POST["username"];
    $password = $_POST["password"];
    $response = array();
    $statement = mysqli_prepare($con, "SELECT * FROM user WHERE username=?");
    mysqli_stmt_bind_param($statement, "s", $username);
    mysqli_stmt_execute($statement);
    if(mysqli_num_rows($statement) > 0) {
        $response["success"] = false;
    }
    else {
        $statement = mysqli_prepare($con, "INSERT INTO user (name, username, password) VALUES (?, ?, ?)");
        mysqli_stmt_bind_param($statement, "sss", $name, $username, $password);
        mysqli_stmt_execute($statement);
        $response["success"] = true;
    }
    echo json_encode($response);
?> 

共有1个答案

卢伟志
2023-03-14

您可以通过在数据库中的用户名上设置一个UNIQUE约束来实现这一点。然后必须设置MySQLI(或PDO)以在错误时抛出异常。

然后,当用户尝试注册一个重复的用户名时,会抛出一个异常,并显示一条特定的错误代码和消息。然后可以使用它来识别出现“重复用户名”的情况,并正确处理它。

这是确保没有输入重复用户名的最佳方法。如果您尝试先检查,然后写入数据库,您将遇到竞争条件。这意味着两次写入可以同时发生,在两次都检查并看到用户名不存在之后。
这种方法可以通过在读取之前锁定表,然后在写入后解锁来抵抗竞争条件。我不推荐这种方法,因为潜在错误的数量会急剧增加。

 类似资料:
  • 这是我的用户注册数据库的方式,但我的问题是:如何防止数据库具有相同用户名的副本,或者换句话说,如果用户名存在于数据库。

  • 我一直在做一个登录/注册系统,我正在接近完成我的注册部分代码。我遇到的唯一问题是如何使它使用户不能用重复的用户名注册。我想让它工作,使我的数据库不会接受信息,它会告诉用户有关错误。 我的PHP

  • 问题内容: 我想提出一种标准做法,以防止任何表在重要的地方重复。在大多数情况下,重复项是变量的组合而不是一个。我的主键只是每个字段的唯一ID,因此我无法使用它们。我一直在做的是先查询表,然后查询所要组合的行数是否为0,然后进行插入。但是,我已经读过,应该有可能在多个字段上设置唯一键以强制唯一性。INSERT IGNORE听起来很可能,但是,我需要在多个列上忽略它。 例如,对于字段关注者和关注对象,

  • 问题内容: 如何防止在php mysql中输入重复记录?在插入表之前验证输入。 我目前正在为我的网站建立一个用户注册部分,但是如果在数据库中发现重复的用户名或电子邮件地址,我想向他们显示一个错误。 编辑 这是我到目前为止要插入的行…我将如何在这里实现这两个答案: 我猜我可以在if … else语句中实现所有功能吗? 问题答案: 我使用了sql语句以及if else语句。 然后 显示错误消息,以防止

  • 问题内容: 我正在用来创建用户并处理身份验证。 当我尝试通过方法通过简单登录创建新用户时,如果已经使用了电子邮件地址,firebase不会创建该用户。但是,在创建用户并将其用作密钥之后,我还用于将创建的用户保存到我的Firebase中。尝试写入数据库时​​,即使用户名不是唯一的,firebase也会保存记录,因为简单登录只需要电子邮件和密码。因此,当用户名不用作用户对象的密钥时,如何验证其唯一性?

  • 我有一些PHP代码与超文本标记语言工作的问题。我正在制作一个简单的程序,它只是让用户按下一个按钮来调用我制作的一堆PHP实践代码。只是基本的PHP东西。 我是PHP的新手,我的超文本标记语言只返回纯文本的PHP。 我的PHP代码, 我的HTML代码, 输出: 错误, 预期成果: 单击提交按钮后,在方法中执行PHP代码。 编辑:Xampp现在工作正常。