是的,在您告诉我将用户名列设置为主键之前,不允许复制。我已经在使用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);
?>
答案 0 :(得分:2)
您可以通过在数据库中的用户名上设置UNIQUE
约束来执行此操作。然后,您必须将MySQLI(或PDO)设置为throw exceptions on errors。
然后,当用户尝试注册重复的用户名时,会抛出一个带有特定错误代码和消息的异常。然后,这可以用于识别何时有重复的用户名&#34;情况,并妥善处理。
这是确保不输入重复用户名的最佳方法。如果您先尝试检查,然后写入数据库,您将遇到竞争条件。这意味着两个写入可以同时发生,在两者都检查并看到用户名已经不存在之后。
通过在读取之前锁定表格然后在写入之后将其解锁,可以使该方法抵抗竞争条件。我不推荐这种方法,因为潜在错误的数量会急剧增加。
答案 1 :(得分:-2)
制作循环以检查用户名。 这个链接可以帮到你