PDO登录脚本失败

时间:2013-07-08 12:24:42

标签: php mysql pdo

感谢我的最后一个问题,我将我的网站更新为PDO,我想在我的头版上开始id,然后更深入地工作,我的第一个障碍就是我的登录脚本。

login-exec.php已编辑

session_start();

include_once ('connect.php');   

$Email = isset($_POST['Email']) ? $_POST['Email'] : "Email Never Sent";
$Password = isset($_POST['Password']) ? $_POST['Password'] : "Password Never Sent";

$stmt = $db->prepare("SELECT * FROM members WHERE Email = :Email AND Password = :Password");
$stmt->bindParam(":Email"   , $Email    );
$stmt->bindParam(":Password", $Password);
$stmt->execute();
$member = $stmt->fetch(PDO::FETCH_ASSOC);
if ($member)    
    { 
            $_SESSION['SESS_MEMBER_ID'] = $member['Member_ID'];
            $_SESSION['SESS_POST_AS'] = $member['Post_As'];
            $_SESSION['SESS_AUTH'] = $member['auth'];
            session_write_close();
            header('location: index.php');
            exit(); 
    } else  {
        header("location: ?p=login-failed");
        exit();
    }

connect.php

$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

编辑:现在我被发送到登录失败的页面,我的问题现在也在于此页面从表单收到的内容了吗?

我知道我的$密码是纯文本,我以前使用过md5而且一旦我得到这个工作生病了实施更好的保护

5 个答案:

答案 0 :(得分:0)

将您的连接尝试放入try / catch,然后您将看到错误

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

答案 1 :(得分:0)

问题可能是if ($count > 1),应该是

if ($count > 0)

if ($count == 1) 

如果sql返回1行,我认为这就是你想要的。

答案 2 :(得分:0)

除了设置正确的错误报告外,还要更改

$count = $stmt->rowCount();

if ($count > 1) 

$member = $stmt->fetch();

if ($member) 

使代码保持一致

答案 3 :(得分:-1)

试试这个:

if ($count > 0) 

if ($count >= 1) 
{
    session_start();    
    $_SESSION['SESS_MEMBER_ID'] = $member['Member_ID'];
    $_SESSION['SESS_POST_AS'] = $member['Post_As'];
    $_SESSION['SESS_AUTH'] = $member['auth'];
    session_write_close();
    header('location: index.php');
    exit(); 
}

答案 4 :(得分:-1)

这将有效,您可以检查是否找到了结果:

$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if($result)
{
    //...
}
else
{
    //...
}

另请注意,您必须始终

session_start();  

位于页面顶部,否则无效。

$ member在这里没有意义,你在哪里创建它? $ member应该作为一行,但在这种情况下,$ result将为你完成这项工作。

我建议您查看phpass以获取密码保护。

你也应该在POST周围制作逻辑,除非你检查,否则你永远无法确定是否真的发布了任何内容。 Ternary Operator可以很方便:

$Password = isset($_POST['Password']) ? $_POST['Password'] : "Password Never Sent";

如果只是为了捕获失败的pdo连接,那么你不应该在整个页面中使用try catch,这应该是你的连接文件的一部分。

我会避免使用“?p = login-failed”,因为如果您没有正在进行任何有效的验证,则很容易操作。

我个人不喜欢bindParam方法,在语句中执行参数数组对我来说更有意义:

$stmt->execute(array(":Email"=>$Email, ":Password"=>$Password));

但在这种情况下,你的方法不应该导致错误。

请注意,您不需要exit();在header();

之后

我希望我的评论有所帮助。