2013-07-08 128 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(); 
}