2013-07-08 131 views
0

感谢我的最后一个问题,即时将我的网站更新为PDO,我认为我的头版开始工作,并且更深入地工作,并且我的第一个障碍击中了我的登录脚本。PDO登录脚本失败

登录-exec.php EDITED

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,一旦我得到这个工作生病实现一些更好的保护

+1

您应该调高PHP错误报告的级别。如果你在login-exec.php中发布的内容是正确的,那么你的右括号太多了,这应该会产生一个错误。 – crush

+0

'$ count> 1'似乎不好,因为只会有一个结果。 –

+0

给我们一个错误消息,使用try ... catch程序创建PDO对象时:http://www.php.net/manual/en/pdo.construct.php – user4035

回答

-1

这将工作,为你检查结果发现或没有:

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

另外请注意,你总是把

session_start(); 

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

$ member在这里没有意义,你在哪里启动它? $成员应该作为一个行,但在这种情况下,$结果会为你做这项工作。

我建议看看phpass以保护密码。

你也应该制定关于POST的逻辑,除非你检查,否则你永远无法确定任何东西是真正发布的。该Ternary Operator可以很方便的位置:

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

你不应该使用尝试捕捉整个页面各处,如果它只是赶上一个失败的PDO连接,这应该是你的连接文件的一部分。

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

我个人不喜欢bindParam方法,它更有意义,我要执行的参数数组到声明:

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

但是你的做法不应该在这种情况下会导致错误。

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

我希望我的意见有所帮助。

+0

尝试这我得到登录失败的页面,我更新了我的主要帖子 – user2558771

+0

我想知道为什么这个投票。 – Jonast92

+0

我没有投票,我不能和不会 – user2558771

0

把你的连接尝试进入一个try/catch,然后你会看到错误

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

@戈登嗯,他没有实际上。他只是说'正确'在我看来,他们应该与正常的'php错误报告'一起使用。换句话说,您应该在开发过程中打开“错误报告”,这是许多开发人员不这么做的情况。 – RiggsFolly

0

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

if ($count > 0) 

if ($count == 1) 

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

+1

或'if($ count> 0)'或'if($ count = 0)' – crush

+0

我同意,取决于数据库条目:D – mirkobrankovic

0

除了设置一个适当的错误报告,也改变

$count = $stmt->rowCount(); 

if ($count > 1) 

$member = $stmt->fetch(); 

if ($member) 

使代码一致

+0

尝试这个我得到登录失败的页面,我更新了我的主帖 – user2558771

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