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

时间:2015-05-14 19:43:22

标签: 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");
}

2 个答案:

答案 0 :(得分:3)

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

mysqli_fetch_array()

  

将结果行提取为关联行,数字数组或两者

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

mysqli_num_rows()

相反
  

获取结果中的行数

替换(这似乎取自费利克斯的回答)

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)并确保$username已定义。我们不知道如何定义

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

即:<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&lt; 5.5使用password_hash() compatibility pack

从使用PDO的ircmaxell's answer拉出准备好的陈述和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
}

<强>脚注:

我注意到你正在使用标题。

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

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

也为另一个做同样的事。

你也在使用会话。您的帖子中不存在session_start();,如果不包含在内,则会失败; 洞察

答案 1 :(得分:1)

这里

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

mysqli_fetch_array返回的值不是整数而是数组。你似乎想要数数:

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

如果出于某种原因以某种方式插入了两个用户,检查count是否大于0可能会阻止插入第三个用户:

 if(count(mysqli_fetch_array($result_check)) > 0) {