php - 网站和数据库 : Check if username exists

标签 php mysql mysqli

我已经在 Google 上搜索了 2 周,但没有找到任何结果。我只想知道如何检查给定的用户名是否存在于我的 MySQL 数据库表中。表名是用户。但它似乎绕过了我的 if 语句,并且继续添加用户名,导致我的表具有相同用户名的重复项。我尝试了很多代码和很多方法。一直在使用 Mysqli,因为那是我们现在应该使用的。我可以为您提供我尝试过的任何方法,但这是我第 100 次再次尝试的最新方法。请注意,我知道这还没有完全准备好防御 SQL 注入(inject),我现在还不担心。我只是想让这个东西先工作,然后我会添加安全性。 另一个要注意的是,我的数据库登录信息存储在一个名为“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();        
            }
        }
    }
}
?>

最佳答案

首先,当您希望数据库表中某行的值只出现一次时,您需要将该列指定为UNIQUE。因此,首先像这样更改 users 表:

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

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

您的脚本不工作,因为您在没有数据库连接对象的情况下调用 mysqli_query

有两种方法可以调用mysql_query:

  • 使用程序风格:mysqli_query($conn, "SELECT * FROM users WHERE username='$username'");
  • 采用 OOP 风格:$conn->query("SELECT * FROM users WHERE username='$username'");

您以过程化的方式调用 mysqli_query 而没有给它一个连接对象。将其更改为上述之一,它将起作用

关于php - 网站和数据库 : Check if username exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37650792/

相关文章:

java - 异常 - java.sql.SQLException : Operation not allowed after ResultSet closed

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

javascript - CodeIgniter - 如何从 Controller 返回 Json 响应

php - 可捕获的 fatal error :第14行的C:\xampp\htdocs\PokemonFight\pokemon.php中无法将类mysqli_result的对象转换为字符串

php - 如何将图像与数据库中的记录链接起来?

mysql - 对查询结果进行子查询?

php - 通过xpath获取div的HTML内容

php - 警告 : exec() [function. exec]:无法在

php - SQL:使用联接从多个表中删除

php - 警告:mysqli::reap_async_query():连接未打开、清除或已关闭