如何防止php / mysql上重复的用户名?

时间:2016-11-22 07:42:24

标签: php mysql

是的,在您告诉我将用户名列设置为主键之前,不允许复制。我已经在使用user_id的主键,这是自动增量。我希望能够在php中检查一下,看看是否已经使用了用户名并将json_encode发送回我的应用程序。顺便说一下,数据库是在线托管的,所以不是真正的本地主机!

这就是我现在正在使用的,这是行不通的:

<?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);
?>

当我运行此托管链接时,我得到success:true,但它应该是假的:

<?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);
?> 

2 个答案:

答案 0 :(得分:2)

您可以通过在数据库中的用户名上设置UNIQUE约束来执行此操作。然后,您必须将MySQLI(或PDO)设置为throw exceptions on errors

然后,当用户尝试注册重复的用户名时,会抛出一个带有特定错误代码和消息的异常。然后,这可以用于识别何时有重复的用户名&#34;情况,并妥善处理。

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

答案 1 :(得分:-2)

制作循环以检查用户名。 这个链接可以帮到你

How to prevent duplicate Usernames in php/mysql