【问题标题】:Check if username already exists using PHP [duplicate]使用PHP检查用户名是否已经存在[重复]
【发布时间】:2015-03-04 10:01:03
【问题描述】:

我想检查我的数据库中是否已经存在用户名。如果是这样,我想重定向回我的注册页面。我的代码可以添加用户名,但不检查用户名是否存在。请帮忙!!!这是 register.php 页面的代码。 该代码完全跳过对“用户名”的检查,如果存在或不存在,则插入到数据库中。

    <?php  
         error_reporting (E_ALL ^ E_NOTICE);    
         include ('dbconn.php');
         session_start();

         $GLOBALS[$error_message];
         $GLOBALS[$username];

         if(isset($_POST['submit']))
           {     
               $error = array();        
               if(empty($_POST['username']))
                 {
                   $error[] = 'Please enter a username. ';
                 }
               else 
                 {
                   $username = mysqli_real_escape_string($connection, $_POST['username']);
                 }

               if(empty($_POST['password']))
                 {
                   $error[] = 'Please enter a password. ';
                 }
               else
                 {
                   $password = mysqli_real_escape_string($connection,$_POST['password']);   
                 }

               if(empty($_POST['cpassword']))
                 {
                   $error[] = 'Please confirm password. ';
                 }
               else
                 {
                   $cpassword = mysqli_real_escape_string($connection,$_POST['cpassword']);
                 }

               if($password == $cpassword)
                 {
                   $mainpassword= $password;
                 }
               else
                 {
                   $error[] = 'Your passwords do not match. ';
                 }      

               if(empty($error))
                 {                     
                   $query = "SELECT * from User WHERE username=' ".$username." ' ";
                   $result = mysqli_query($connection, $query) or die
                       (mysqli_error($connection));

                  if(mysqli_num_rows($result)> 0)
                  {
                   $multi = "Sorry ! This Username is not available...Please choose another";
                  }
                  else{ $sql="INSERT INTO user(username,password)VALUES                          ('$username','$password')";

              mysqli_query($connection, $sql) or die(mysqli_error($connection));
              header('Location:/MySQLi/confirmation.php'); }
}
               else
                  {
                    $error_message = '<span class="error">';
                    foreach($error as $key => $values) {
                    $error_message.="$values";
                    }
                    $error_message.="</span><br/><br/>";    
                    } 
                 }
?>

【问题讨论】:

  • 也发布您的 HTML 表单。
  • 不确定是否重要,但表名“用户”在您的 SELECT 语句中大写,而不是在 INSERT 语句中。
  • 这应该做什么$multi = "Sorry !... 以及您如何退出它?好像大门被破坏了,敞开着。您只是为其分配一个变量,它会从那里继续前进,然后插入到数据库中。添加返回/退出/死亡。您还应该在每个标题后添加一个退出。
  • 尝试回显“select * from User...”以检查是否有任何错误。在最后一种情况下,将其粘贴到 phpMyAdmin 中,看看它是否有帮助。
  • 了解 PHP - AJAX,它将更优雅地解决您的问题。

标签: php mysql


【解决方案1】:

您在用户名周围手动添加空格,因此它看起来不存在:

$query = "SELECT * from User WHERE username=' ".$username." ' ";
                                             ^             ^

应该是:

$query = "SELECT * from User WHERE username='".$username."' ";

使用准备好的语句可以一次性避免该问题和潜在的 sql 注入问题:

$query = "SELECT * from User WHERE username=?";

还要确保始终使用表名和列名:User 不一定与 user 相同。

另请注意,您不应该将纯文本密码存储在数据库中,您应该salt and hash them

【讨论】:

  • 考虑到这是mysqli,用字符串连接来做是非常混乱的。
  • @jeroen 查看他的 INSERT 语句,您需要将表名“用户”更改为“用户”。不确定大小写是否会抛出查询,但它在 OP 的代码中不一致。
  • 关于字母大小写dev.mysql.com/doc/refman/5.0/en/… - 表名以小写形式存储在磁盘上,并且名称比较不区分大小写。 MySQL 在存储和查找时将所有表名转换为小写。此行为也适用于数据库名称和表别名。
  • @Fred-ii- 我一直认为这取决于文件系统的大小写敏感性。很高兴知道。
  • ...但是还有其他一些信息表明 表和数据库名称使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上。名称比较区分大小写。如果您在具有不区分大小写文件名的系统(例如 Windows 或 Mac OS X)上运行 MySQL,则不应将此变量设置为 0。如果您在不区分大小写的文件系统上使用 --lower-case-table-names=0 将此变量强制为 0,并使用不同的字母大小写访问 MyISAM 表名,则可能会导致索引损坏。 - 因此,字母大小写是一个问题.困惑。
【解决方案2】:

SQL 表名可以区分大小写,因此“用户”和“用户”不同。如果您的表以小写形式命名为 'user',则大写形式的 'SELECT * FORM User' 可能不会给出任何结果。

如果您只是想检查是否存在,您可以选择“1”并添加限制 1,这样查询就不会扫描整个表,如下所示:

"SELECT 1 FROM user WHERE username='" . $username . "' LIMIT 1";

或者您可以将您的用户名列设为唯一,如果用户名已经存在,则 INSERT 语句将失败,从而为您提供一个简单的单查询检查,既可以插入新用户,也可以让您知道该名称是否已经存在采取了。

最后,您的代码很容易受到 SQL 注入攻击。始终转义用户输入或使用准备好的语句。

【讨论】:

  • 关于UNIQUE 索引的注释是一个很好的观察。在这种情况下,1/0 有什么意义?这比SELECT COUNT(*) 好在哪里?
  • 它不选择任何行,它只是检查该行是否存在。它比 COUNT 更好,因为它只选择一行,或者不选择。
  • SELECT 1 会更有意义。为什么除以零,顺便返回NULL
  • 它返回行数为 1 的 null 或一个空集。 Null 是因为它没有选择任何数据,只是存在。你也可以选择 1,我使用 '1/0' 是出于习惯,这有点像是说 'one or none'
  • 这很古怪:在 SQL 中,1/0 的意思是一除以零,这让很多程序员很草率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2023-03-22
相关资源
最近更新 更多