0

感谢我的最后一个问题,我将我的网站更新为 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();
    }

连接.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);

编辑:现在我被发送到登录失败页面,那么我的问题现在是否在于该页面从表单中收到的内容?

我知道我的 $password 是纯文本,我以前使用过 md5,一旦我得到这个工作病态实施一些更好的保护

4

5 回答 5

0

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

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
于 2013-07-08T12:30:15.347 回答
0

也许问题是if ($count > 1)并且应该是

if ($count > 0)

或者

if ($count == 1) 

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

于 2013-07-08T12:30:23.630 回答
0

除了设置适当的错误报告外,还要更改

$count = $stmt->rowCount();

if ($count > 1) 

$member = $stmt->fetch();

if ($member) 

使代码一致

于 2013-07-08T12:39:02.007 回答
-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(); 
}
于 2013-07-08T12:42:42.460 回答
-1

这将起作用,您可以检查是否找到了结果:

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

另请注意,您始终必须将

session_start();  

在页面顶部,否则将无法正常工作。

$member 在这里真的没有意义,你在哪里初始化它?$member 应该作为一行,但在这种情况下,$result 会为您完成这项工作。

我建议看一下phpass的密码保护。

您还应该围绕 POST 制定逻辑,除非您检查,否则您永远无法确定是否确实发布了任何内容。三元运算符在这里很方便:

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

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

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

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

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

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

请注意,您不需要 exit(); 在标头()之后;

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

于 2013-07-08T12:55:10.550 回答