准备好的PDO语句在设置变量

时间:2017-09-04 08:56:31

标签: php mysql sql database pdo

我从其他一个项目中获取了一个登录脚本,并为我当前的项目设置了它。创建数据库(没有托管)并将文件上传到FTP后,我转到了INDEX页面,但在尝试登录一次后,错误的详细信息没有发生任何事情,通常它应该显示消息说'不正确的凭据',但它没有。我在代码中的不同位置设置了echo命令,并设法将错误范围缩小到一行。该行将一个名为$sql的变量设置为准备好的SELECT语句,由于某种原因,这将停止代码,因为之后放置的任何echo命令都将无法运行。关于发生了什么以及如何解决它的任何想法?或者你们认为跟随更多login system会更好吗?这似乎包括也有助于安全的令牌。

        // Confirm login
            echo "1";
            include("config.php");
            $username = $_POST['username'];
            $password = $_POST['pass'];
            if(isset($_POST) && $username != '' && $password != ''){
                echo "2".$username;
                $sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
                echo "3";
                $sql->execute(array($username));
                if($sql->rowCount() > 0) {
                while($result = $sql -> fetch()){
                    $pass = $result['password'];
                    $p_salt = $result['psalt'];
                    $id = $result['id'];
                }
                echo "3";
                $site_salt="salthashhere";
                $salted_hash = hash('sha256',$password.$site_salt.$p_salt);
                if($pass == $salted_hash){
                    echo "5";
                    $_SESSION['user'] = $id;
                    header("Location:home.php");
                } else {
                     echo "<h2>Username/Password is Incorrect.</h2>";
                     echo "<a href='register.php'>Register Here</a>";
                }
            }

1 个答案:

答案 0 :(得分:0)

您需要注意的一件事rowCount()无法保证在SELECT语句中使用时提供准确的结果,通常用于返回受上一个 DELETE <影响的行数/ strong>, INSERT UPDATE 语句由相应的PDOStatement对象执行。

在您的情况下选择后,您可能需要将所有结果作为数组获取,然后使用count()方法计算返回的元素数。

请尝试以下代码:

<?php
// Confirm login
echo "1";
include("config.php");
$username = $_POST['username'];
$password = $_POST['pass'];
if (isset($_POST) && $username != '' && $password != '') {
    echo "2" . $username;
    $sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
    echo "3";
    $sql->execute(array($username));
    $result = $sql->fetchall(); //fetch all results as array
    if (count($result) > 0) {
        foreach ($result as $key => $row) {
            $pass   = $row['password'];
            $p_salt = $row['psalt'];
            $id     = $row['id'];

            echo "3";
            $site_salt   = "salthashhere";
            $salted_hash = hash('sha256', $password . $site_salt . $p_salt);
            if ($pass == $salted_hash) {
                echo "5";
                $_SESSION['user'] = $id;
                header("Location:home.php");
            } else {
                echo "<h2>Username/Password is Incorrect.</h2>";
                echo "<a href='register.php'>Register Here</a>";
            }
        }//end foreach

    } else {
        // account does not exist
        echo "<h2>account does not exist.</h2>";
        echo "<a href='register.php'>Register Here</a>";
    }
}
?>
  PS:你可能想看看并利用php内置的优势   密码_hash()和密码_verify()它们更安全。