2012-06-09 39 views
2

我還在重做,擺脫了我的代碼中的舊mysql_ *命令。我試圖把我的會話登錄表單的舊代碼,這是我得到迄今:如何在PDO中使用會話?

public function login($user, $password) 
    { 
    if (!empty($user) && !empty($password)) 
    {  
     $password = $web->doHash($user, $password); // in this function is (return sha1(strtoupper($user).':'.strtoupper($password)) 
     $stmt = $db_login->prepare("SELECT * FROM account WHERE username=:user AND pass_hash=:password"); 
     $stmt->bindValue(':user', $user, PDO::PARAM_STR); 
     $stmt->bindValue(':password', $password, PDO::PARAM_STR); 
     $stmt->execute(); 
     $rows = $stmt->rowCount(); 

     if ($rows > 0)  
     {  
     $results_login = $stmt->fetch(PDO::FETCH_ASSOC); 
     $_SESSION['user_name'] = $results_login['username']; 
     $_SESSION['user_id'] = $results_login['id']; 
     return true; 
     } 
     else 
     { 
     return false; 
     } 
    } 
    else 
    { 
     return false; 
    } 
    } 

之後,如果用戶登錄的網站我使用的檢查:

public function isLogged() 
    { 
    return (!empty($_SESSION['user_id']) && !empty($_SESSION['user_name'])); 
    } 

但似乎 - 這函數返回總是空的,因爲$ _SESSION不存在於PDO中?當然,註銷在這種形式用在我的網站:

public function logout() 
    { 
     unset($_SESSION['user_id']); 
     unset($_SESSION['user_name']);  
    } 

但我認爲PDO具有處理會話不同的方式?我沒有找到任何這樣的東西,我可以在PDO中添加$ _SESSION,並且更改代碼很多?

我在我的web項目中使用變量$_SESSION['user_name']$_SESSION['user_id']

摘要:

1)如何在PDO中正確使用會話?

2)有什麼用$stmt->fetch(PDO::FETCH_ASSOC);$stmt->fetchAll();

之間的區別謝謝。

+0

+1 *。現在閱讀你的問題:) –

+3

PDO和會話是PHP的2個無關特性。他們可以並且通常可以共存。你是否登錄函數返回true,仍然會話變量是空的?你事先調用了session_start()嗎? –

+0

我沒有叫session_start() - 我應該把它放在哪裏?我只是__構建,但我刪除了它。 – Byakugan

回答

1

PDOStatement::rowCount()不工作mysql,所以$行不會返回任何東西。 另外,PDO與會話無關,它是處理數據庫的擴展。

如果你要計算結果的數量,你可以做

$stmt->execute(); 
$results = $stmt->fetchAll(); 
$results = count($results); 
+0

你知道我的第二個問題的答案嗎? :) – Byakugan

+0

我知道何時使用這個或那個,但無法清楚地解釋它。你應該閱讀手冊或其他人可以解釋。 – romainberger

+0

那麼這裏是這種情況是更好的使用?或者也許更安全或更實用? :) – Byakugan

2

的答案如下:在您使用會話的每個頁面的頂部

  1. 呼叫session_start()
  2. 區別在於$stmt->fetch()會取一行,fetchAll()會取整個結果集。
+0

如果它的工作還沒有session_start()我應該仍然使用它?我應該在註銷功能中使用session_destroy()之類的東西嗎? – Byakugan

1

答案:

1)確保在session_start()被調用的數據正在從查詢

更多信息返回使用會話

2)確保所有頁面的開始

PDO::FETCH_ASSOC檢索按列名索引的數據。即associative array

在我看來,使用PDO::FETCH_ASSOC總是比較好,因爲它很清楚處理了哪些數據正在提取&。

您也可以使用此代碼在關聯數組形式獲取所有的行,如果你選擇fetchAll(PDO::FETCH_ASSOC)

有關的FetchAll PDO功能更多信息有擺脫mysql_一臉here

+0

所以它似乎沒有正確地將變量添加到$ _SESSION ['user_name']和$ _SESSION ['user_id']它終於編輯函數後,但會話變量是空的,當我打印他們的任何想法?即使打印成功打印該功能,但空變量......我絕望。 – Byakugan

+0

您是否確保if語句正在運行 - if($ rows> 0)&session_start()已在所有必需的頁面中調用? – Haroon

+0

@Byakugan - 在檢查我在之前的評論中提出的兩項內容後,我還建議檢查以下變量是否已填充:$ results_login ['username']&$ results_login ['id'] – Haroon