1

我还处于早期学习阶段,我用头撞墙寻找线索。我一直在阅读手册无济于事。

我正在根据 phpAcadmy 教程“注册和登录”构建用户登录系统。他们在教程中使用 mysql_connect,但我使用的是与 mysql 的 PDO 连接。

1) 函数 user_id_from_username 应该返回user_id已发布的 $username 的条目。我的没有,我对如何简单地返回条目感到困惑,我只需要一点指导和解释。

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 整数:“die($login)”。

(我没有包括其他两个函数:user_exists 和 user_active,因为我让它们正常工作)

它正确打印错误数组,它登录正常,除了下一步。

提前感谢您帮助我!

4

3 回答 3

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;
}
}
于 2013-05-03T05:01:14.803 回答
0

在准备好的语句?中使用。被?替换为 中给出的变量bind_param。在您的代码?中将替换为$username

$stmt = $db->prepare('SELECT `user_id` FROM `users` WHERE `username` = ?');
$stmt->bindParam(1, $username);
于 2013-05-03T05:20:18.170 回答
-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();
}
于 2013-05-03T05:46:12.777 回答