Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php rowCount()不适用于SELECT count(*)_Php_Mysql_Login_Pdo_Connection - Fatal编程技术网

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

Php rowCount()不适用于SELECT count(*),php,mysql,login,pdo,connection,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->

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

编辑:原来的答案有点不对劲。您可以在两个位置都使用“:”

此外,如果这个脚本按照您期望的方式工作,那么它将允许任何人登录,而不考虑密码,因为您使用的是COUNT,然后检查返回的行数。计数查询返回的行数将为1。总是1。它将包含一个值,可以是0、1或更多

但是:rowCount不适用于SELECT语句。

示例2计算SELECT语句返回的行数

对于大多数数据库,PDOStatement::rowCount不会返回受SELECT语句影响的行数。相反,请使用PDO::query发出一个SELECT COUNT*语句,该语句的谓词与您想要的SELECT语句相同,然后使用PDOSTATENT::FETCHTCOLUMN检索将返回的行数。然后,应用程序可以执行正确的操作

您需要给计数一个别名,获取它,然后使用它


在数据库中存储普通密码是一个严重的安全缺陷

,因此,您永远不应该向WHERE子句实际添加密码,而是获取哈希值,然后使用

因此,在用户登录的情况下,仅选择计数的查询根本不适用-您必须选择记录本身

正确的代码取自我的


我很抱歉,但是你说无论我做什么,我仍然要登录到login.php是什么意思?+1喜欢这样的解释对初学者来说非常有用
$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");
}
$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");
}