【问题标题】:Duplicate User accounts重复的用户帐户
【发布时间】:2013-06-22 08:42:22
【问题描述】:

我最近刚问了一个问题,并将我的代码固定为以下代码:

{ 
//Check if user already exists 
$un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'");  
if(mysql_num_rows($un_check) >0) {
echo "Username already exists";
}
else{
 // Username Free
}

并且在注册时它声明“用户名已经存在”但是,它仍然允许我创建帐户并将相同的信息添加到数据库中。

这是我的代码或数据库的问题吗?

【问题讨论】:

  • 您的代码容易受到 SQL 注入攻击!
  • 强制: mysql_* 函数将是 deprecated in PHP 5.5。不建议编写新代码,因为它会在未来被删除。相反,MySQLiPDObe a better PHP Developer
  • 这是一个检查,您需要根据检查的结果编写应该发生的事情。我们无法在此处编写符合您要求的代码
  • 我知道这一点,我会修复它。
  • @user2517092 — 修复现有代码。扔掉现有的代码。使用正确的 API 重写代码。 不是一种高效的编程方法!

标签: php html mysql


【解决方案1】:

如果您想禁止在表中输入相同的值两次,请创建一个unique index

检查是否存在条目是一回事 - 禁止插入具有相同值的另一行是另一回事。

添加这样一个索引的工作方式如下:

ALTER TABLE `users` ADD UNIQUE `MY_UNIQUE_INDEX` ( `username` ) 

【讨论】:

  • @user2517092 我编辑了答案以添加指向相应 MySQL 文档的链接。
【解决方案2】:

您可以简单地将向数据库添加用户的 mysql 查询代码放在 else 块中。这样,如果用户已经存在,您将永远不会插入到数据库中。

【讨论】:

    【解决方案3】:

    可能的情况

    • Username 在您的数据库中不是唯一的。

    • (如果您不想更改表结构)将代码的insert 部分放在else 语句中。

      if(mysql_num_rows($un_check) >0) { echo "用户名已经存在"; } 别的{ //插入新用户名 }

    顺便说一句,不要使用 mysql_ 函数。已弃用

    【讨论】:

      【解决方案4】:

      另一种方法是谋杀脚本。我的意思是,使用die(); 函数。这会在您放置脚本的任何位置停止脚本。你会想像这样插入它:

      //Check if user already exists 
      $un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'");  
      if(mysql_num_rows($un_check) >0) {
          echo "Username already exists";
          die(); // Don't continue, as we don't want to insert a username
      }
      else{
          // Username Free
      }
      

      虽然这可行,但如果无论用户名是否存在,您仍要执行任何其他代码,只需按照其他人的建议将插入用户的代码放在 else{} 块中即可。

      【讨论】:

      • 是我遗漏了什么,还是他总是检查名称为 $un 的同一个用户,而不是检查变量 $un 的内容?
      • PHP 将放在双引号内的变量转换为其变量内容,如果您对此感到困惑的话。 $un = '约翰'; $un_check = mysql_query("SELECT username FROM users WHERE Username = '$un'");将转换为 SELECT username FROM users WHERE Username = 'john',而只有单引号时,它将以 SELECT username FROM users WHERE Username = '$un'的形式运行查询>.
      【解决方案5】:

      我遇到了同样的问题,我的解决方案是这样的

      <?php
      //Connection Script Start
      $mysql_host = "localhost";
      $mysql_user = "root";
      $mysql_password = "*******";
      $mysql_database = "db_name";
      $connect = mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_database);
      //Connection Script Ends
      
      $un = "userabc";
      $search = "SELECT * FROM table_name WHERE username='$un'";
      $query = mysqli_query($connect, $search);
      $i = mysqli_num_rows($query);
      if($i==0){
      //username free
      }else{
      echo "This username is already taken";
      }
      ?>
      

      【讨论】:

      • proper escaping practices 的鲁莽无视会让您在使用这种方法时遇到麻烦。另外,请不要在新代码中使用mysql_query。它已被弃用,并将在 PHP 的未来版本中删除。
      • Niraj:即使使用 mysqli_query,您也需要转义,因为您的代码容易受到微不足道的 SQL 注入攻击。如果你想试试,建立一个数据库,并传入x' ; DROP TABLE table_name -- ,导致运行未转义的SQL并删除你的表。
      • 你使用mysqli_query的方式是完全错误的。您必须使用bind_param 而不是字符串连接。您的原始问题包含mysql_query,因此您在此处进行了改进,但$un 不应出现在您的查询字符串中。
      【解决方案6】:

      问题有两个方面。

      首先,严格从数据存储(也称为数据库)的角度来看,问题在于执行不力的数据库设计。如果用户名是需要唯一的字段,则应通过向用户名列添加唯一索引在数据库中声明该字段。这将创建正确的数据库设计,因此如果用户名值已存在于表中,则无法添加新记录 - 因此是唯一索引。

      第二,检查用户名是否存在的代码。检查数据库是否有重复项后,它是否仍在创建帐户,或者您只是说您可以在数据库中手动复制用户名?如果代码仍在复制用户,那么可能是因为结果是一个空集 - 即没有结果,因为没有用户名存在,因此它不会返回行数,因此将 > 更改为 >=。

      【讨论】:

      • 嗯,我的意思是,在我检查数据库是否有重复项后,它仍在创建帐户。
      猜你喜欢
      • 2016-08-16
      • 2012-03-24
      • 2020-02-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      相关资源
      最近更新 更多