rowCount()不适用于SELECT count(*)

时间:2014-05-01 17:45:07

标签: php mysql login pdo connection

我正在尝试学习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。 我检查了我的数据库连接,它正在工作。我不知道问题是什么。你能帮助我吗?

2 个答案:

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