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