2013-05-03 124 views
1

即時通訊仍處於早期學習階段,我的頭撞牆尋找線索。我一直在閱讀手冊無濟於事。簡單的登錄功能使用PDO

IM建設基礎上,phpAcadamy教程「註冊&登錄」用戶登錄系統。他們在教程中使用mysql_connect,但是我正在使用到mysql的PDO連接。

1)功能user_id_from_username應返回張貼的$用戶名user_id條目。我沒有,我不知道如何簡單地返回條目,我只需要一點點的指導和解釋。

2)登錄功能的工作原理,但我需要的,如果真它返回$ USER_ID,這樣我可以設置會話。

這裏是我的代碼:「死($:

<?php 
    function user_id_from_username(PDO $db, $username) { 
    $stmt = $db->prepare('SELECT `user_id` FROM `users` WHERE `username` = 1'); 
    $stmt->bindParam(1, $username); 
    $stmt->execute(); 
    return ($stmt->fetchColumn()); 
    } //??? I NEED THIS FUNCTION TO RETURN THE `user_id` ENTRY FOR $username 

    function login(PDO $db, $username, $password) { 
    $user_id = user_id_from_username($db, $username); 
    $password = md5($password); 
    $stmt = $db->prepare('SELECT COUNT(`user_id`) FROM `users` WHERE `username` = ? AND `password` = ?'); 
    $stmt->bindParam(1, $username); 
    $stmt->bindParam(2, $password); 
    $stmt->execute(); 
    return (bool) $stmt->fetchColumn(); 
    } //??? I NEED THIS FUNCTION TO RETURN $user_id IF TRUE (to set session) 

    //---------------------login.php----------------------- 

    if (empty($_POST) === false) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    if (empty($username) === true || empty($password) === true) { 
    $errors[] = 'You need to enter a username and password.'; 
    } else if (user_exists($db, $username) === false) { 
    $errors[] = 'We can\'t find that username. Have you registered?'; 
    } else if (user_active($db, $username) === false) { 
    $errors[] = 'You haven\'t activated your account!'; 
    } else { 
    $login = login($db, $username, $password); 
    if ($login === false) { 
    $errors[] = 'That username/password combination is incorrect.'; 
    } else { 
    die($login); 


    } 
    } 
    print_r($errors); 
    } 

因此,根據該登錄腳本,登錄成功(良好的用戶名和密碼,並主動交代)應該輸出$ USER_ID整數後登錄)」。

(我沒有包括其他兩個函數:user_exists和user_active,因爲我讓他們正常工作)

它正確打印錯誤陣列,它會在ok了,除了這一步。

在此先感謝您的幫助!

回答

2

你必須把?這裏

$stmt = $db->prepare('SELECT `user_id` FROM `users` WHERE `username` = 1'); 

應該

$stmt = $db->prepare('SELECT `user_id` FROM `users` WHERE `username` = ?'); 

編輯

使用此功能

function login(PDO $db, $username, $password) { 
$user_id = user_id_from_username($db, $username); 
$password = md5($password); 
$stmt = $db->prepare('SELECT COUNT(`user_id`) FROM `users` WHERE `username` = ? AND `password` = ?'); 
$stmt->bindParam(1, $username); 
$stmt->bindParam(2, $password); 
$stmt->execute(); 
if($stmt->fetchColumn() > 0) { 
    return $user_id; 
} else { 
    return false; 
} 
} 
+0

好,謝謝,錯過了1 IM仍然有回線的麻煩。當我登錄時,它顯示'1'而不是user_id,因爲我缺少重要的東西。即時通訊只是試圖學習的初學者。 – mholberger 2013-05-03 05:20:45

+0

@mholberger查看編輯答案。 – 2013-05-03 05:27:04

+0

它的工作原理!謝謝! – mholberger 2013-05-03 05:32:41

0

在準備好的語句中使用??被替換爲bind_param中給出的變量。在你的代碼?$username

$stmt = $db->prepare('SELECT `user_id` FROM `users` WHERE `username` = ?'); 
$stmt->bindParam(1, $username); 
-1

代替在登錄功能使用user_id_from_username()使得完全沒有意義的。
除了獲得計數,而不是實際的id

你可以在一個一步做到這一點:

function login(PDO $db, $username, $password) { 
    $password = md5($password); // you should add salt and change hash function 
    $sql = 'SELECT user_id FROM `users` WHERE `username` = ? AND `password` = ?'; 
    $stmt = $db->prepare($sql); 
    $stmt->execute(array($username, $password)); 
    return $stmt->fetchColumn(); 
}