我正在尝试学习PDO,所以我通过制作简单的登录脚本进行培训 但似乎有一个问题,因为我的脚本不起作用。
这是我的剧本:
if(isset($_POST['Submit'])){
$sql= "SELECT COUNT (*) FROM `managers` WHERE `username` = :username and `password` = :password ";
$result = $connection->prepare($sql);
$result->bindParam(":username" ,$_POST['username']);
$result->bindParam(":password" ,$_POST['password']);
$result->execute();
$num=$result->rowCount();
if($num > 0){
header("location:index.php");
}else{
header("location:login.php");
}
}
我的HTML表单是这样的:
<form action="login.php" method="post" enctype="multipart/form-data" name="logform" id="logform" class="form-signin" role="form" >
<h2 class="form-signin-heading">LOGIN HERE</h2>
<input name="username" id="username" size="30" maxlength="64" type="text" class="form-control" placeholder="Enter Your Username ...">
<input name="password" type="password" id="password" size="30" maxlength="24" class="form-control" placeholder="Enter Your Password ...">
<input class="btn" name="Submit" type="submit" value="Login"/>
</form>
无论我做什么,我仍然会前往login.php
。
我检查了我的数据库连接,它正在工作。我不知道问题是什么。你能帮助我吗?
答案 0 :(得分:2)
编辑:原始答案有点偏。你可以在两个地方都有':'。
此外,此脚本(如果它按预期方式工作)将允许任何人登录而不管密码,因为您正在使用COUNT()然后检查返回的行数。 COUNT()查询返回的行数为1.始终为1.它将包含一个值,可以是0,1或更多。
但是:rowCount()
不适用于SELECT语句。
http://www.php.net/manual/en/pdostatement.rowcount.php
示例#2计算SELECT语句返回的行
对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出带有与预期SELECT语句相同的谓词的SELECT COUNT(*)语句,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后,您的应用程序可以执行正确的操作。
您需要为计数提供别名,获取并使用它。
http://www.php.net/manual/en/pdostatement.fetchcolumn.php
$sql= "SELECT COUNT (*) AS num FROM `managers` WHERE `username` = :username and `password` = :password ";
$result = $connection->prepare($sql);
$result->bindParam(":username" ,$_POST['username']);
$result->bindParam(":password" ,$_POST['password']);
$result->execute();
$num=$result->fetchColumn();
if($num > 0){
header("location:index.php");
}else{
header("location:login.php");
}
答案 1 :(得分:-1)
在数据库中存储普通密码严重的安全漏洞。
Passwords must be hashed,因此您永远不应该在WHERE子句中实际添加密码,而是获取哈希值,然后使用dedicated function验证它。
因此,在用户登录的情况下,仅选择计数的查询根本不适用 - 您必须选择记录本身。
正确的代码(取自我的PDO examples page)将是
$stmt = $pdo->prepare('SELECT * FROM `managers` WHERE `username` = :username');
$stmt->execute(['username' => $_POST['username']]);
$user = $stmt->fetch();
if ($user && password_verify($_POST['password'], $user['password']))
header("location:index.php");
}else{
header("location:login.php");
}