【问题标题】:Why wont this check to see if a user exists?为什么不检查用户是否存在?
【发布时间】:2015-05-14 19:43:22
【问题描述】:

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

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

        //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");
}

【问题讨论】:

  • 首先,这对你没有帮助mysql_error()使用mysqli_error($connection)
  • 请告诉我$username 不只是从$_POST['username'] 之类的东西得到的
  • php中没有这个功能mysqli_fetch_array
  • @Alex Oh really?
  • @M0n5terBunny 在您的原始问题中您没有使用计数。用答案的内容来编辑您的问题通常是不可接受的。那是解决方案吗?即使您添加了计数,您的用户是否仍然插入?

标签: php mysql mysqli


【解决方案1】:

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

mysqli_fetch_array():

以关联、数字数组或两者的形式获取结果行

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

相对于mysqli_num_rows()

获取结果中的行数

替换(似乎取自 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) &gt;0) 并确保已定义 $username。我们甚至不知道它是如何/在哪里定义的


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

即:&lt;input type="text" name="username"&gt;


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 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
}

脚注:

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

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

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

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

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

【讨论】:

  • @Darren 我想在拳头上添加一点 zing ;-) 谢谢。
  • 这是一个措辞得体,值得回答的先生 :-)
【解决方案2】:

这里

 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) {

【讨论】:

  • 看起来 OP 可能在他们的编辑中借用了您的代码 if(count(mysqli_fetch_array($result_check)) === 1)
  • 看起来确实如此......不知道如何反应。
  • 我的猜测是,他们的 HTML 表单。可以是未命名的元素,也可以是没有 post 方法;谁知道。我投票结束的不清楚,没有被撤回。这个问题太啰嗦了。
  • 我认为 OP 跑掉了。我没有留下来。他们需要调试他们的代码。 重新来过.
  • OP 毕竟使用了错误的功能,可能没有看到my comment to them 并在我发布的答案中提到了它。我不会撤回我对您的回答的赞成票,并且有几个原因;-)
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2016-02-05
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多