PDO应用程序 - 登录无法正常运行

时间:2012-09-05 19:52:44

标签: php session pdo

好吧,所以我正在构建一个新的应用程序,并决定使用PDO进行数据库访问。 (我对PDO完全不熟悉,但我觉得这是进行数据库访问的最佳方式)。

现在,我的登录脚本非常简单。它使用给定的用户名(来自登录表单)检查数据库中的用户,尝试将给定密码与纯文本中存储的密码匹配(不加密/解密尚未),并重定向用户有必要的。这是一个简单的序列图:

Login Screen ---(user enters credentials)--->Login Handler---(gets user details and compares pw)-->if (pw == stored pw)--->dashboard / else --->login w/ error msg

对不起,如果这很难读,我不确定代表流程的最好方法......反正......

这是我的问题:我输入了正确的用户名和密码(区分大小写甚至!),并且总是会重定向回登录屏幕并显示错误消息。但是,如果我只是通过网址栏转到仪表板,我重定向回登录屏幕(如果没有设置会话,我应该是),我的用户名显示在导航中吧(好像我已经正确登录)。

再次,抱歉,如果这很难遵循。有点难以简单解释。如果这是一个问题,我可以做一个类型的截屏来更好地解释。无论哪种方式,这是我的代码:

loginHandler.php

if(!isset($_POST['username']) || !isset($_POST['password'])){
    header('Location: login.php?error=pass');
}
$username = $_POST['username'];
$pass = $_POST['password'];

//TODO: crypt password

try{
    $DB = new PDO("mysql:host=127.0.0.1;port=8889;dbname=cTix", 'root', 'root'); //TODO: change this when uploading to webserver
    $STH = $DB->prepare("SELECT * FROM users WHERE username = $username LIMIT 0, 1");
    $STH->setFetchMode(PDO::FETCH_OBJ);
    $STH->execute();
    $u = $STH->fetch();
    if($pass == $u->password){
        session_start();
        $_SESSION['uid'] = $u->id; //TODO: securely store uid
        header('Location: index.php');
    } else {
        //echo 'Your Password: ' . $pass . ' - Correct Password: ' . $u->password;
        header('Location: login.php?error=pass');
    }
} catch(PDOException $e){
    //echo $e->getMessage();
    header('Location: login.php?error=true');
    exit;
}

这里是检索dashboard.php的用户名的代码:

function connection(){
    $host = 'localhost';
    $dbname = 'cTix';
    $user = 'root';
    $pass = 'root';
    try {
        $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        return $DBH;
    } catch(PDOException $e){
        echo $e->getMessage();
        return null;
    }
}

function getUserById($id){
    $DB = connection();
    $STH = $DB->query("SELECT * FROM users WHERE id = $id");
    $STH->setFetchMode(PDO::FETCH_OBJ);
    $u = $STH->fetch();
    $DB = null;
    return $u;
}

function getUserName(){
    echo getUserById(getCurrentUserId())->name;
}

如果我可以提供任何其他信息,或者我能提供的任何更有帮助的信息,请告诉我们!

不幸的是,如果没有找到这个愚蠢的登录问题,我无法在这个应用程序上取得任何进展,所以任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:2)

以下是您的问题所在:

$STH = $DB->prepare("SELECT * FROM users WHERE username = $username LIMIT 0, 1");

您将用户名连接到SQL字符串中,但不引用它。我怀疑这会解决问题:

$STH = $DB->prepare("SELECT * FROM users WHERE username = '$username' LIMIT 0, 1");

<强>无论其

您应该研究如何使用绑定参数。您已经在使用PDO了,但是您仍然在SQL中编写用户输入的代码,绑定参数可以避免这种情况 - 它也可以避免这个问题。

这应该有用,但我没有测试过:

$STH = $DB->prepare('SELECT * FROM users WHERE username = ? LIMIT 0, 1');
$STH->bindParam(1, $username);
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute();