【问题标题】:Mysqli check if username already exists [duplicate]Mysqli检查用户名是否已经存在[重复]
【发布时间】:2015-02-19 13:33:30
【问题描述】:

是的,我知道以前有人问过这个问题,我从这个网站的多个答案中复制了代码,试图让它工作。这是我现在一直在使用的代码,但它一直允许我输入重复的条目。

$query = mysqli_query($con, "SELECT * FROM Email WHERE Email = '".$testemail. "'");
if(mysqli_num_rows($query) > 0){
    echo "Email is already in use.<br>";
}else{
    $query = mysqli_query($con, "SELECT * FROM Username WHERE Username = '".$testname. "'");
  if(mysqli_num_rows(  $query) > 0){
    echo "Username is already in use.<br>";
}else{
    $sql = "INSERT INTO users (Username, Password, Email, Firstname, Lastname, Lastlogin, Registered) VALUES ('$testname', '$testpass', '$testemail', '$testfirstname' , '$testlastname', '$lastlogin', '$registered')";
    if ($conn->query($sql) === TRUE) {
        echo "New account created successfully<br>";
    } 
  }
}

是应该阻止这种情况发生的具体代码,但here is the full page:

我第一次使用这样的登录系统,所以如果我犯了一些愚蠢的错误,我不会感到惊讶。

编辑:我尝试编辑它,但它仍然无法正常工作,我还在我的数据库中设置了“电子邮件”和“用户名”列唯一。但这所做的只是完全阻止数据的输入。我还尝试了一种解决方法,它在错误号 1062 处显示错误,但这种情况还没有奏效。

The new code

我也错过了一些明显的东西,我使用的是 IF 语句,所以它只会在我认为时循环通过 fie 查询检查

【问题讨论】:

  • 比较的值是什么?如果这些值确实应该是唯一的,那么对数据库列设置唯一约束也会有所帮助。旁注:您可能对这段代码的 SQL 注入攻击持开放态度。
  • 在代码链接中,他使用 mysqli_real_escape_string 进行 sql 注入。例如$testname = mysqli_real_escape_string($con, $_POST['username']);
  • 是的,我的一位朋友告诉我使用 mysqli_real_escape_strings 作为主计数器而不是那些。有没有更好/更安全的方法来保护与注射?
  • @Crecket:准备好的语句有帮助,并带来其他性能优势:php.net/manual/en/mysqli.quickstart.prepared-statements.php

标签: php database login mysqli


【解决方案1】:

我怀疑那些 SELECT 查询失败了,因为它们没有读取插入到数据库中的相同数据。这是您的插入:

INSERT INTO users ...

但您从不同的表中进行选择:

SELECT * FROM Email ...
SELECT * FROM Username ...

如果值位于名为users 的表中,为什么要从名为EmailUsername 的表中进行选择?也许您打算从users 中进行选择?这也意味着您可以在一个查询中完成,而不是两个:

SELECT * FROM users WHERE Username = '".$testname. "' OR Email = '".$testemail. "'

【讨论】:

  • 您能否编辑我的代码,以便检查列中的所有值?我认为它出于某种原因只检查第一行
  • @Crecket:你的意思不是很清楚。一方面,没有“第一行”。除非明确定义,否则不能保证数据库中的行顺序。如果用户名和/或电子邮件应该是唯一的,那么我会 expect 上述查询仅返回一行。 (或零行。)您的更新尝试以何种方式不起作用?随意编辑问题以表明这一点。
【解决方案2】:

我在我的数据库中创建了唯一的名称列,然后通过这一行添加了新数据:

$sql = "INSERT INTO users (Username, Password) VALUES ('$testname', '$testpass')";
if (!($conn->query($sql))) {
    echo "Username is already in use";
}else{
    echo "New account created successfully";
}

如果输入的数据已经存在,它将给出一个错误,而不是简单地发送一条消息,表明该名称已在使用中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多