当前位置: 首页 > 知识库问答 >
问题:

网站和数据库:检查用户名是否存在

拓拔飞飙
2023-03-14

我已经在谷歌上搜索了两个星期了,没有任何效果。我只想知道如何检查给定的用户名是否存在于我的MySQL数据库表中。表名为用户。但是它似乎绕过了我的if语句,直接添加用户名,导致我的表有相同用户名的重复。我试过很多代码,也试过很多方法。一直在使用MySQL,因为这是我们现在应该使用的。我可以给你我尝试过的任何方法,但这是我第100次尝试的最新方法。请注意,我知道这还没有完全准备好抵御SQL注射,我现在还不担心。我只是想让这东西先工作,然后我会增加安全性。另一个需要补充的注意事项是,我的数据库登录信息存储在一个名为“credentials.php”的单独的PHP文件中。感谢先进。代码:

<?php
$password1 = ($_POST['pass1']);
$password2 = ($_POST['pass2']);
$firstname = ($_POST['fname']);
$lastname = ($_POST['lname']);
$username = ($_POST['user']);
$email = ($_POST['email']);     

/*
include_once 'credentials.php';
$dbhandle = new mysqli($db_hostname, $db_username, $db_password, $db_database); 
 */
// Check if any fields are empty
if (empty($_POST['fname']) or empty($_POST['lname']) or empty($_POST['user']) or empty($_POST['email']) or empty($_POST['pass1']) or empty($_POST['pass2'])){
?>
<div class="ERRORBOX">
<?php
 // Empty Fields ERROR
    echo "You must enter data into ALL of the fields to register. Please try again.";
    header( "refresh:5;url=../index.php" );
?>
    <p>You will be redirected in <span id="counter">5</span> second(s).</p>
    <script type="text/javascript">
    function countdown() {
        var i = document.getElementById('counter');
        if (parseInt(i.innerHTML)<=0) {
            location.href = 'login.php';
        }
        i.innerHTML = parseInt(i.innerHTML)-1;
    }
    setInterval(function(){ countdown(); },1000);
    </script>
</div>
<?php
} else {
    // Check if passwords match
    if ($password1 !== $password2) {
    ?>
    <div class="ERRORBOX">
    <?php
    // Password mismatch ERROR
        echo "You entered two different passwords! Please try again.";
        header( "refresh:5;url=../index.php" );
    ?>
        <p>You will be redirected in <span id="counter">5</span> second(s).</p>
        <script type="text/javascript">
        function countdown() {
            var i = document.getElementById('counter');
            if (parseInt(i.innerHTML)<=0) {
                location.href = 'login.php';
            }
            i.innerHTML = parseInt(i.innerHTML)-1;
        }
        setInterval(function(){ countdown(); },1000);
        </script>
    </div>
    <?php
    } else {    
        // Create connection
        include_once 'credentials.php';
        $conn = new mysqli($db_hostname, $db_username, $db_password, $db_database);
        // Check connection
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }
        // Check if username exists <<<THIS IS WHERE I AM HAVING TROUBLE<<<<<
        $username = ($_POST['user']);

        $query = mysqli_query("SELECT * FROM users WHERE username='$username'");
        if(mysqli_num_rows($query) > 0){
            echo "That username already exists.";   
            $conn->close();
        }
        else{
            //IT JUST SKIPS THE CODE ABOVE AND GOES STRAIGHT TO THE ONE BELOW
            $firstname = ($_POST['fname']);
            $lastname = ($_POST['lname']);
            $username = ($_POST['user']);
            $email = ($_POST['email']);
            $password = ($_POST['pass1']);
            $ipaddress = $_SERVER['REMOTE_ADDR'];  

            // Create connection
            include_once 'credentials.php';
            $conn = new mysqli($db_hostname, $db_username, $db_password, $db_database);
            // Check connection
            if ($conn->connect_error) {
                die("Connection failed: " . $conn->connect_error);        
                $sql = "INSERT INTO users (`id`, `username`, `password`, `sign_up_date`, `email`, `email_activation`, `permit`, `status`, `first_name`, `last_name`, `dob`, `ipv4`) VALUES (NULL, '$username', '$password', NOW(), '$email', '0', 'c', 'a', '$firstname', '$lastname', '1985-01-01', '$ipaddress')";

                if ($conn->query($sql) === TRUE) {
                    header('Location: ../success.php');
                } else {
                    echo "Error: " . $sql . "<br>" . $conn->error;
                }        
                $conn->close();        
            }
        }
    }
}
?>

共有3个答案

归德厚
2023-03-14

将唯一约束添加到表中。

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

这将防止重复插入。您仍然应该尝试找出为什么mysqli_num_行出现问题。我建议您手动运行查询,看看它是否返回结果。

章振
2023-03-14

我强烈建议只向表列添加一个唯一的约束。

在MySQL中运行以下查询:

ALTER TABLE users ADD CONSTRAINT ux_username UNIQUE (username)

现在不做任何检查,只需插入新用户并检查$conn即可-

$sql = "INSERT INTO users (`id`, `username`, `password`, `sign_up_date`, `email`, `email_activation`, `permit`, `status`, `first_name`, `last_name`, `dob`, `ipv4`) VALUES (NULL, ?, ?, NOW(), ?, '0', 'c', 'a', ?, ?, '1985-01-01', ?)";

$stmt = $conn->prepare($sql);
$stmt->bind_param('ssss', $username, $password, $email, $firstname, $lastname, $ipaddress);
$stmt->execute();

if (empty($conn->error())) {
    header('Location: ../success.php');
    exit; //remember to exit after redirections
} else {
    echo 'Username already exists.';
}

我还更改了您的代码以正确插入数据。插入原始用户输入是危险的,因为可能有一个松散的单引号或分号。

农波涛
2023-03-14

首先,如果希望数据库表中的行的值只出现一次,则需要将该列指定为唯一。因此,首先修改users表,如下所示:

ALTER TABLE users CHANGE COLUMN username username VARCHAR(255) NOT NULL UNIQUE;

完成此操作后,如果脚本尝试在数据库中插入一行,该行包含已使用的用户名,则该行不会插入,也不会有重复的。但这还不够,您需要一种方法来通知用户他们想要的用户名已经在使用中,所以这就是PHP脚本的用武之地。

您的脚本无法工作,因为您在没有数据库连接对象的情况下调用了mysqli\u query

有两种方法可以调用mysql\u query

  • 使用过程样式:mysqli_query($conn,"SELECT*from user WHERE username='$username'");
  • ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

您可以以过程方式调用mysqli\u query,而不给它一个连接对象。将其更改为上述选项之一,它将正常工作

 类似资料:
  • 问题内容: 因此,基本上,我想在注册表格中添加一个功能,该功能将检查数据库中是否已存在该用户名。 我对AJAX有几个问题- 1)我想创建一个AJAX请求on_change函数,所以像这样- 因此,据我所知,我必须在validation.php文件中包含所有在PHP中进行的验证,对吗?是否需要任何特殊的验证,或者只是使用sql语句进行的简单验证- 2)据我所知,我也必须通过$ .ajax传递POST

  • 问题内容: 我想检查某个网站是否存在,这就是我正在做的事情: 如果该页面不存在(错误402或其他任何错误),我可以在该行中做什么以确保正在读取的页面退出? 问题答案: 您可以使用HEAD请求而不是GET。它将仅下载标题,而不下载内容。然后,您可以从标题中检查响应状态。 或者你可以使用 或者你可以使用

  • 问题内容: 我正在尝试允许用户通过搜索用户名来开始游戏并关注其他用户。我需要确保具有该用户名的用户存在。我正在使用以下代码,但是尽管调用了,但在应调用时却没有被调用。 JSON数据树 问题答案: 轻松解决: 不要使用.childAdded,因为当查询找不到任何内容时,该块将不会执行。 而是使用.Value并检查NSNull

  • 问题内容: 无法让Firebase识别已经输入的用户名。下面的代码显示我正在尝试将输入的用户名与数据库的DataSnapshot进行比较。该代码似乎没有拾取输入的用户名。代码是否错误? 在按钮上单击,我希望能够将用户引导到该错误,并且在该错误唯一之前,不应将该页面推送到下一个活动。 JSON树(如果有帮助) 问题答案: 是异步操作。设置回调后,代码将继续运行,而您尚未获取任何用户名。到您检查mSw

  • 我有麻烦让我的代码工作。当用户输入用户名时,它会检查数据库,看看它是否存在,以及它是否设置了

  • 问题内容: 我正在开发一个网站,要求用户必须登录才能使用该系统。当前功能为:当用户输入用户名和密码时,将在数据库中进行检查以检查该用户是否存在以及是否输入了正确的密码。然后才允许该用户登录。 到现在为止还不错,现在客户端希望向日志记录功能添加更多功能,即客户端只希望该用户存在一个会话。 IE。如果user1是从PC的一个浏览器登录的,则不应允许他从另一个系统或同一PC的另一个浏览器登录。 我怎么做