如何确保PHP/mySQL中只使用未使用的登录名?

如何确保PHP/mySQL中只使用未使用的登录名?,php,mysql,login,Php,Mysql,Login,我试图建立一个网站的数据库,允许用户登录,如果他们已经创建了一个帐户,或创建一个帐户,然后登录。我目前遇到的问题是,我只希望将未使用的用户名添加到数据库中,并拒绝使用过的用户名。我的mySQL查询似乎可以工作,如果userInput不在集合中,则返回一个空集合。目前,如果您输入任何用户名,无论是否使用,它都不会允许您输入。 下面是我的代码: if($firstName != null && $address != null) { $userCheck =$db

我试图建立一个网站的数据库,允许用户登录,如果他们已经创建了一个帐户,或创建一个帐户,然后登录。我目前遇到的问题是,我只希望将未使用的用户名添加到数据库中,并拒绝使用过的用户名。我的mySQL查询似乎可以工作,如果userInput不在集合中,则返回一个空集合。目前,如果您输入任何用户名,无论是否使用,它都不会允许您输入。 下面是我的代码:

    if($firstName != null && $address != null) 
 {
    $userCheck =$dbh->query("SELECT userID FROM user WHERE userID='$userInput'"); 
            if(!$userCheck)
            { 
                $sql = "INSERT INTO user(firstName, userID, password, address) VALUES ('$firstName', '$userInput', '$password', '$address')"; 
                $dbh->exec($sql);   
                is_password_correct($userInput, $password);
            }   

  } 
本质上。。。如果前两个字段已填充(或不为null),则查询将运行,如果为空,则服务器应接收信息并允许用户访问页面

  function is_password_correct($userInput, $password)
{ 
    $dbh = new PDO
    $userInput = $_POST["userID"]; 
    $password = $_POST["password"]; 
    $firstName = $_POST["first"]; 
    $rows =$dbh->query("SELECT password FROM user WHERE userID='$userInput' "); 
    if($rows)
        { 
            foreach ($rows as $row)
                {
                    if($password == $row["password"])
                    { 
                        return TRUE;
                    } 
                }
        }
    return FALSE; 
}

正如马克·贝克所说,试着这样做:

 if($firstName != null && $address != null) 
 {
    $userCheck =$dbh->query("SELECT userID FROM user WHERE userID='$userInput'"); 
            if(!mysql_num_rows($userCheck))
            { 
                $sql = "INSERT INTO user(firstName, userID, password, address) VALUES ('$firstName', '$userInput', '$password', '$address')"; 
                $dbh->exec($sql);   
                is_password_correct($userInput, $password);
            }   

  } 

$dhb->query不返回行计数,只返回资源或布尔值false。因此,您必须使用
fetchColumn
对返回的资源中的行进行计数

{
    $userCheck =$dbh->query("SELECT userID FROM user WHERE userID='".$userInput."'");
    $num_rows = $userCheck->fetchColumn; 
    if($num_rows == 0)
    { 
        $sql = "INSERT INTO user(firstName, userID, password, address) VALUES ('$firstName', '$userInput', '$password', '$address')"; 
        $dbh->exec($sql);   
        is_password_correct($userInput, $password);
    }   

} 

您应该使用
num_rows
,下面是它的 此外,您还应该更改在查询中使用引号
(“$userInput”)
的方式-

  if($firstName != null && $address != null) 
 {
    $userCheck =$dbh->query("SELECT userID FROM user WHERE userID='".$userInput."'"); 
            if($userCheck->num_rows == 0)
            { 
                $sql = "INSERT INTO user(firstName, userID, password, address) VALUES ('".$firstName."', '".$userInput."', '".$password."', '".$address."')"; 
                $dbh->exec($sql);   
                is_password_correct($userInput, $password);
            }   

  }
您提到您正在使用pdo,因此
rowCount()
是与pdo一起使用的正确方法,如下所示-

    if($firstName != null && $address != null) 
     {
        $userCheck =$dbh->query("SELECT userID FROM user WHERE userID='".$userInput."'"); 
        $count = $userCheck->rowCount();
                if($count == 0)
                { 
                    $sql = "INSERT INTO user(firstName, userID, password, address) VALUES ('".$firstName."', '".$userInput."', '".$password."', '".$address."')"; 
                    $dbh->exec($sql);   
                    is_password_correct($userInput, $password);
                }   

      }

$dbh->query()
如果查询失败,则返回布尔值false。。。。。但失败的查询意味着执行失败,而不仅仅是返回任何记录失败。后者是100%有效的查询返回,返回一个空结果集,而不是布尔值false。。。。然后,您需要检查返回的行数,您确实应该在这里使用准备好的语句。也希望您使用了一个好的密码哈希函数。可能与下面发布答案的任何人的答案重复,OP使用的是
mysqli\u
,而不是
mysql\u
。我们也不知道您的输入和变量来自何处,也不知道您的
密码是正确的()。这里有太多的猜测。检查PHP和MySQL方面的错误。我们也不知道您在这里使用的是
mysqli_uu
还是PDO。这将失败
mysql_unum_urows
您不能混合使用不同的mysql API。现在每个用户都可以注册和登录,不管他们的$userInput是否与数据库中已有的用户相同……因此需要更改
mysql_unum_urows
,为了适应
mysqli\uu
API,为什么OP要“尝试这个”?一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了未来的访客。“我正在使用PDO。我现在就发布is_密码_correct()——14秒前的NewtoCompSci。”。所有这些都是mysql\u num\u rows()
的原因。将失败。