簡體   English   中英

rowCount()不適用於SELECT count(*)

[英]rowCount() doesn't work with SELECT count(*)

我正在嘗試學習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()然后檢查返回了多少行。 COUNT()查詢返回的行數將為1。始終為1。它將包含一個值,該值可以為0、1或更大。

但是: rowCount()在SELECT語句上不起作用。 http://www.php.net/manual/en/pdostatement.rowcount.php

Example#2計數SELECT語句返回的行

對於大多數數據庫,PDOStatement :: rowCount()不會返回受SELECT語句影響的行數。 而是使用PDO :: query()發出與所要SELECT語句相同的謂詞的SELECT COUNT(*)語句,然后使用PDOStatement :: fetchColumn()檢索將返回的行數。 然后,您的應用程序可以執行正確的操作。

您將要為count提供一個別名,獲取並使用它。

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

在數據庫中存儲普通密碼是一個嚴重的安全漏洞

密碼必須經過哈希處理 ,因此您絕對不應在WHERE子句中實際添加密碼,而應獲取哈希值,然后使用專用功能進行驗證。

因此,僅選擇一個計數的查詢在用戶登錄的情況下根本不適用-您必須選擇記錄本身。

正確的代碼(取自我的PDO示例頁面 )為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM