php - 为什么不检查用户是否存在?

标签 php mysql mysqli

我正在执行查询以检查用户是否存在,然后再将其添加到数据库。如果该结果返回,则死亡并回显“用户名已存在”,但如果返回为空,则将新用户添加到数据库中。

出于某种原因,它只是向数据库添加了一个新用户。

        //If post was 
        if (isset($_POST['submit'])) {

        // Check if username is blank
        if (!isset($_POST['username']) || empty($_POST['username'])) {
            echo "Username was blank<br />";
            die();
        } else {
            $username = mysqli_real_escape_string($connection, $_POST['username']);
        }

        // Check if password is blank
        if (!isset($_POST['password']) || empty($_POST['password'])) {
            echo "Password was blank<br />";
            die();
        } else {
            $password = mysqli_real_escape_string($connection, $_POST['password']);
            $password2 = md5($password);
            //echo $password;
        }

        // Check if email is blank
        if (!isset($_POST['email']) || empty($_POST['email'])) {
            echo "Email was blank<br />";
            die();
        } else {
            $email = mysqli_real_escape_string($connection, $_POST['email']);
            //$password = md5($password);
            //echo $password;
        }

        //Check to see if username alread exsists 
        $query_check = "SELECT * FROM users WHERE user = '$username' LIMIT 1";
        $result_check = mysqli_query($connection, $query_check);

         if(count(mysqli_fetch_array($result_check)) === 1) {
            echo "Username exists.";
            die();   

         } else {
                $query = "INSERT INTO users (user, pass, email) VALUES ('$username','$password2','$email');";
                $result = mysqli_query($connection, $query);
                if($result){  // returned TRUE, e.g. in case of a DELETE sql  
                    $_SESSION["username"] = $username;
                    header("Location: ../profile.php");

                } else { // returned FALSE
                    //echo "Error: " . mysqli_error($connection);
                    echo "Error during register <a href='../register.php'>Back To Register</a>";
                    die();
                }
         }



    } else {
        header("Location: ../index.php");
}

最佳答案

在花几分钟测试您的代码后,发现您使用了错误的函数。

mysqli_fetch_array() :

Fetch a result row as an associative, a numeric array, or both

您正在尝试获取关联数组。

相对于 mysqli_num_rows() :

Gets the number of rows in a result

替换(这似乎取自 Félix 的回答)

if(count(mysqli_fetch_array($result_check)) === 1)

if(mysqli_num_rows($result_check) == 1)

if(mysqli_num_rows($result_check) > 0)

您的原始帖子包含:

if(mysqli_fetch_array($result_check) === 1)

这仍然是错误的方法。


if(mysqli_num_rows($result_check) >0) and make sure $username is defined. We don't know how/where if it is even defined.


现在,如果 THAT 失败了,那么你的表单元素没有命名,和/或你表单中的其他东西让你失败。

即:<input type="text" name="username">


添加error reporting到您的文件的顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告只应在试运行中进行,绝不能在生产中进行。


关于使用 MD5。

就密码散列而言,这不再被认为是安全的。

  • 该技术已经过时,被认为已失效。

对于密码存储,使用 CRYPT_BLOWFISH或 PHP 5.5 的 password_hash() 功能。

对于 PHP < 5.5 使用 password_hash() compatibility pack .


来自 ircmaxell's answer它使用带有准备好的语句的 PDO 和 password_hash() :

只需使用一个库。严重地。它们的存在是有原因的。

不要自己动手。如果您要创建自己的盐,您做错了。你应该使用一个库来为你处理。

$dbh = new PDO(...);

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);

登录时:

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
    if (password_verify($_POST['password'], $users[0]->password) {
        // valid login
    } else {
        // invalid password
    }
} else {
    // invalid username
}

脚注:

我注意到您正在使用 header 。

您应该添加 exit;在每个标题之后。否则,您的代码可能想要继续执行。

header("Location: ../profile.php");
    exit;

对另一个也做同样的事情。

您也在使用 session 。 session_start();不存在于您的帖子中,如果不包含将会失败; 洞察力

关于php - 为什么不检查用户是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245973/

相关文章:

mysql 只返回不同的?

mysql - 如何使用 VB.NET treeview 从 MySQL 作为数据库创建 TreeView

mysql 1022错误重复键

php - 使用 PHP 执行多个 MYSQL 查询

php - Wordpress 索引页面上的特定 CSS

javascript - 使用 Jquery 创建和获取动态 url

php - 如何让查询按降序排列的一组值添加排名

php - Cakephp 查询未呈现正确的数据

php - 如何使用mysqli bind_result

php - 如何使用 mysqli dbdriver 知道行是否被删除