2012-03-07 40 views
0

重复的用户名(这是我第一次尝试用PHP)我如何防止PHP/MySQL的

有一个非常基本的注册页面。 http://graves-incorporated.com/test_sites/member_test/register/register.php

*我只记得PHP代码不会在源显示所以在这里,它是:

enter code here 
<?php 
include('connection.php'); 

if(isset($_POST['form'])){ 
    if(empty($_POST['username']) || empty($_POST['password']) || empty($_POST['conf_pass']) || empty($_POST['email'])){ 
     echo '<b>Please fill out all fields.</b>'; 

    }elseif($_POST['password'] != $_POST['conf_pass']){ 
     echo '<b>Your Passwords do not match.</b>'; 
    }else{ 
     $url = 'http://graves-incorporated.com/test_sites/plantation_park_2012/'; 
     echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL='.$url.'">'; 
     echo '<b>Congrats, You are now Registered.</b>'; 
     mysql_query("INSERT INTO users VALUES(NULL, '$_POST[username]', '$_POST[password]', '$_POST[email]')");  
    } 
} 
?> 

我要确保我没有得到重复的用户和/或电子邮件地址在数据库中。我在MySQL中为用户名和电子邮件设置了一个唯一密钥,这可以防止它,但实际表单上的用户不知道,它仍然告诉他们“恭喜,您已注册”或者无论它说什么......哈哈

那么,我可以添加到PHP代码(以及代码中的哪个地方),以防止这种情况?

感谢您帮助这个大菜鸟, 丹格雷夫斯

+1

你需要检查'插入'查询是否失败。如果确实如此 - 请使用'mysql_error()' – zerkms 2012-03-07 09:54:29

+0

查看消息,你能告诉我如何输入吗? php对我来说实际上是一门外语。我尽可能快地学习它,但仍然没有完全掌握它。haha – 2012-03-07 09:56:53

+2

查找SQL注入攻击;你的代码是不安全的。 – James 2012-03-07 09:57:19

回答

6
<?php 
include('connection.php'); 

if(isset($_POST['form'])){ 
    if(empty($_POST['username']) || empty($_POST['password']) || empty($_POST['conf_pass']) || empty($_POST['email'])){ 
     echo '<b>Please fill out all fields.</b>'; 

    }elseif($_POST['password'] != $_POST['conf_pass']){ 
     echo '<b>Your Passwords do not match.</b>'; 
    }else{ 

     $dup = mysql_query("SELECT username FROM users WHERE username='".$_POST['username']."'"); 
     if(mysql_num_rows($dup) >0){ 
      echo '<b>username Already Used.</b>'; 
     } 
     else{ 
      $url = 'http://graves-incorporated.com/test_sites/plantation_park_2012/'; 
      echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL='.$url.'">'; 

      $sql = mysql_query("INSERT INTO users VALUES(NULL, '$_POST[username]', '$_POST[password]', '$_POST[email]')");  
      if($sql){ 
       echo '<b>Congrats, You are now Registered.</b>'; 
      } 
      else{ 
       echo '<b>Error Registeration.</b>'; 
      } 
     } 
    } 
} 
?> 
+0

你的代码有效!一个小问题,虽然我设置了它的方式(可能不是最好的方式),它完成后重定向到另一个网站。唯一的问题是如果你输入一个重复它仍然转发。 如果这是不可能做的事我可以只禁用自动转发 – 2012-03-07 10:08:53

+1

@丹格拉夫斯看到更新的代码 – mgraph 2012-03-07 10:10:21

+0

你是男人!谢谢!!这个PHP的东西有点棘手,但我得到这些天之一;) – 2012-03-07 10:15:22

1

您正在使用哪个数据库驱动程序?你在找数据库错误吗?他们中的一些人只是开心地逃过任何数据库错误,你必须专门调用一个函数来检查数据库错误。你的数据库应该对重复数据产生错误,你可以选择这个错误并提醒用户。

+0

中我正在使用MySql 5.那是什么意思?我将如何设置该功能 – 2012-03-07 10:00:10

+1

不,驱动程序是连接到数据库的。 mysql,mysqli或PDO都是MySQL的PHP​​驱动程序。我从你的代码中看到你使用的是哪个驱动程序。在php.net上查找mysql_error()并使用它来检查错误。 – James 2012-03-07 10:02:40

0

你可以在提交检查/防止已经存在之前使用ajax查询 也可以在后端执行INSERT INTO ...你可以做SELECT FOUND_ROWS()来检查它是否实际上等于1,这意味着一个行插入。 然后将用户重定向到错误页面,并提供哪些信息不正确。 为了更好的用户体验,我推荐第一个选项,使用JQuery它不需要很多时间来实现。

1

从用户界面的立场来看,我认为这将是巨大的,如果他们有通过Ajax请求,以检查是否在数据库中存在与否的用户名,有点像一个可用性检查的能力。

如果你隔离检查用户可用性的过程而不是处理所有事情,只是为了发现用户名不可用,它还可以节省你的CPU时间。

要通过jQuery为此,我建议:

$('#checkAvailabilityButton').click(function() { 
    var usernameVal = $('#usernameField').val(); // assuming this is a input text field 
    $.post('checkusername.php', {username=usernameVal}, function(data) { 
     alert('data'); 
    }); 
}); 

并在您的php结束运行数据库的查询,将看​​起来像:

"SELECT Username FROM users WHERE Username = 'POSTVALUE'" 

if (mysql_num_rows > 0) { 
    echo "Username is taken" 
} 

而且非常非常小心,不要允许unsanitized后变量到您的数据库,以防止SQL注入。

最后,尝试使用更好的PHP数据库扩展类似MySQLi,大多数STMT请求会通过mysqli_prepare自动清理变量。

祝你好运!

+0

我不知道什么“unsanitized后变量”,但我想读这些注入攻击,但它并没有真正对我有任何意义,哈哈我是php/MySql的定义noob – 2012-03-07 10:55:01

+0

让我们来看看你的插入示例。例如,SELECT username FROM users WHERE username ='“。$ _ POST ['username'] but post will x'; DROP TABLE'username --- BAM,the whole table get wiped out。 – optimum 2012-03-07 11:04:54

+0

oh man,yeah I better看看如何解决这个问题,这个注册页面只会通过电子邮件发送给一个公寓大楼里的一些人,在任何地方都没有链接,你认为我仍然需要担心吗? – 2012-03-08 01:37:39