2015-01-06 125 views
-1

我想检查用户名是否已经存在于我的数据库中。如果是这样,我想重定向到我的注册页面。我有代码添加用户名,但不检查用户名是否存在。请帮忙!!!这是register.php页面的代码。 该代码完全跳过了“用户名”检查并插入数据库(如果存在与否)。检查用户名是否已经存在使用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/>";  
        } 
       } 
?> 
+0

也发布您的HTML表单。 –

+0

不确定它是否重要,但表名'user'在SELECT语句中大写,但不是INSERT语句。 – versalle88

+0

这是应该做的事情$ multi =“对不起!......”你是如何退出它的?看起来好像门被打破了,而且是左开放的,你只是给它分配一个变量, ,然后插入到数据库中,添加一个return/exit/die,你也应该在每个头后添加一个出口 –

回答

6

您手动添加在你的用户名空格所以它看起来像它不存在:

$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

+0

我只是想对此发表评论。这是我的下一步;-) –

+0

打我吧... – versalle88

+2

考虑到这是'mysqli',这样做与字符串连接是非常混乱。 – tadman

1

SQL表名可以区分大小写,所以'用户'和'用户'是不一样的。如果您的表格以小写字母命名为'user',那么使用大写字母的'SELECT * FORM User'可能不会给出任何结果。

如果你只是想检查是否存在,您可以选择“1”,并添加限制1,以便查询没有扫描整个表,像这样:

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

或者你可以让你的用户名栏UNIQUE,那么如果用户名已经存在,那么INSERT语句会失败,给你一个简单的单查询检查,既可以插入新用户,也可以让你知道是否已经使用该名称。

最后,您的代码对SQL注入攻击广泛开放。始终逃避用户输入或使用准备好的语句。

+0

关于'UNIQUE'指数的说明是一个很好的观察。在这种情况下,“1/0”的意义何在?这比'SELECT COUNT(*)'更好吗? – tadman

+0

它不会选择任何行,它只是检查行的存在。它比COUNT好,因为它只选择一行,或者不选择。 – Brian

+0

'SELECT 1'会更有​​意义。为什么被零除,偶然返回NULL? – tadman

相关问题