1

私はまだ学習の初期段階にあり、頭を壁にぶつけて手がかりを探しています。無駄にマニュアルを読んでいました。

phpAcadamyチュートリアルの「登録とログイン」に基づいてユーザーログインシステムを構築しています。チュートリアルでは mysql_connect を使用していますが、私は mysql への PDO 接続を使用しています。

1) 関数 user_id_from_username はuser_id、投稿された $username のエントリを返す必要があります。私はそうではありません。単にエントリを返す方法について混乱しています。少しのガイダンスと説明が必要です。

2) ログイン機能は機能しますが、セッションを設定できるように、TRUE の場合は $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)" が出力されます。

(他の 2 つの関数、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 に答える