如何防止php / mysql中重复的用户名

时间:2012-03-07 09:52:48

标签: php mysql duplicates registration

(这是我第一次尝试使用php)

我有一个非常基本的注册页面。 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代码(以及代码中的位置?)

感谢您帮助这个主要的菜鸟, 丹格雷夫斯

4 个答案:

答案 0 :(得分:5)

<?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>';
            }
        }
    }
}
?>

答案 1 :(得分:1)

您使用的是哪个数据库驱动程序?你在寻找数据库错误吗?他们中的一些人很乐意驾驭任何数据库错误,你必须专门调用一个函数来检查数据库错误。您的数据库应该在重复数据上引发错误,您可以选择该错误并提醒用户。

答案 2 :(得分:1)

从用户界面的角度来看,我认为如果他们能够通过ajax请求检查是否存在db中的用户名,那将会很棒,就像可用性检查器一样。

如果您隔离检查用户名可用性的过程而不是处理所有内容,只是为了找出用户名不可用,它还可以节省您的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"
}

另外要非常小心,不要将未经过修改的post变量放入数据库以防止SQL注入。

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

祝你好运!

答案 3 :(得分:0)

您可以在提交检查/阻止之前使用ajax查询 在INSERT INTO之后的后端...你可以执行SELECT FOUND_ROWS()来检查它是否实际上等于1,这意味着插入了一行。 然后将用户重定向到错误页面,其中包含不正确的信息。 为了获得更好的用户体验,我建议使用第一个选项,使用JQuery不需要花费很多时间来实现。