3

私のログインスクリプトではすべて正常に動作しています。div (id=login_reply) で適切な応答が得られ、セッションが開始されます。しかし、ページを更新するたびに、login_reply が表示されなくなります。login_reply を保持するにはどうすればよいですか? ありがとうございました!

これがphpです:

if (isset($_POST['username'], $_POST['password']))
{
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string(md5($_POST['password']));

    $check = mysql_query("SELECT * FROM `userbase` WHERE `user_name` = '$username'");
    if (mysql_num_rows($check) > 0)
    {
        while ($row = mysql_fetch_assoc($check))
        {
            $user_id = $row['user_id'];
            $user_name = $row['user_name'];
            $user_email = $row['user_email'];
            $user_password = $row['user_password'];

            if ($password == $user_password)
            {
                $_SESSION['user_id'] = $user_id;
                if (isset($_SESSION['user_id']) && $_SESSION['user_id'] != '')  
                    echo "Welcome back '$user_name'!";
                else
                {
                    echo 'no';
                }

            }
            else
                echo 'no';
        }
    }
    else
        echo 'no';  
}

ここにjQueryがあります

$(document).ready(function()
{

$('#login').click(function()
{
    var username = $('#username').val();
    var password = $('#password').val();

    $.ajax(
    {
        type: 'POST',
        url: 'php/login.php',
        data: 'username=' +username + '&password=' + password,
        success: function(data)
        {
            if (data != 'no')
            {
                $('#logform').slideUp(function()
                {
                    $('#login_reply').html(data).css('color', 'white');
                });
            }
            else                    
                $('#login_reply').html('Invalid username or password').css('color', 'red');
        }
    });
    return false;
});
});
4

3 に答える 3

3

問題は、JS が単なるクライアント側のスクリプト言語であることです。クライアントのブラウザでのみ処理されます。

AJAX を使用してログインする場合は、問題ありませんが、ログインしているユーザーの値をセッション (または Cookie) に保存する必要があります。次に、ページが読み込まれるたびに、そのセッションまたはCookieが設定され、存在するかどうかを確認し、存在する場合は、ログイン後にjQueryのHTMLに対応するHTMLを書き留めます...

つまり、次のことを行います。

  1. ページの読み込み - ユーザーがログインしていません
  2. ユーザーはログイン資格情報を入力し、「ログイン」をクリックします
  3. そのユーザーが存在するかどうかを確認し、存在する場合は保存します$_SESSION['username'](たとえば)
  4. AJAX内であなたはそれを埋めます$('#login_reply')
  5. ユーザーがあなたのウェブサイト内のリンクをクリックする
  6. に値がある (またはインデックスが設定されている) かどうかを確認します$_SESSION['username']
  7. ある場合は、PHP で #login_reply div を入力します。そうでない場合は、ログイン フォームを表示します...

お役に立てれば...

EDIT1:また、クライアントブラウザでJSが機能しない(無効になっている)方法でログイン機能を実装する必要があるため、通常のPOSTを考慮に入れる必要があります...

EDIT2:また、いくつかの一般的なプログラミングの間違いを指摘したい...

ここに私のコメントが追加されたあなたのコードがあります:

if (isset($_POST['username'], $_POST['password']))
{ // <-- This is a .NET style of writing the brackets that I don't like much and I guess PHP don't like .NET either :-)
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string(md5($_POST['password']));

    $check = mysql_query("SELECT * FROM `userbase` WHERE `user_name` = '$username'"); // <-- mysql_* method calls should be replaced by PDO or at least mysqli
    // Also the query could be improved
    if (mysql_num_rows($check) > 0)
    {
        while ($row = mysql_fetch_assoc($check)) // <-- why calling while when You expect ONLY one user to be found?
        {
            $user_id = $row['user_id'];
            $user_name = $row['user_name'];
            $user_email = $row['user_email'];
            $user_password = $row['user_password']; // <-- What are these last 4 lines good for? This is useless...

            if ($password == $user_password) // <-- this condition SHOULD be within the SQL query...
            {
                $_SESSION['user_id'] = $user_id;
                if (isset($_SESSION['user_id']) && $_SESSION['user_id'] != '')  // <-- this condition is useless as You have just set the session variable... 
                // ALSO, if You use brackets with else it is good to use brackets also with if
                    echo "Welcome back '$user_name'!";
                else
                {
                    echo 'no';
                }

            }
            else
                echo 'no';
        }
    }
    else
        echo 'no';  
}

そして、これが私の書き直されたコードです(まだmysql_ *を使用しています。申し訳ありません):

if (isset($_POST['username'], $_POST['password'])) {
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string(md5($_POST['password']));

    $check = mysql_query("SELECT * FROM `userbase` WHERE `user_name` = '{$username}' AND `user_password` = '{$password}' LIMIT 1"); // <-- We check whether a user with given username AND password exists and we ONLY want to return ONE record if found...
    if ($check !== false) {
        $row = mysql_fetch_assoc($check);

         $_SESSION['user_id'] = $row['user_id'];

         echo "Welcome back '{$row['user_name']}'!";
    } else {
        echo 'no';
    }
} else
    echo 'no';
}
于 2012-05-15T08:10:57.567 に答える
2

最も簡単な解決策は、Cookie を使用することです。

PHP 側では、Cookie を宣言して削除します。

<?php
if (!isset($_COOKIE['new_one']) ) {
  setcookie('new_one', "ole", 0, "/");
  echo "logged in";
}
else {
  setcookie('new_one', null);
  echo "logged out";
}
?>

そしてjQueryクライアント側では:

$(document).ready(function() {
  if ($.cookie("new_one") === "ole") {
    $('#login_reply').html("Show msg only when the server sets the cookie.");
  }
});
于 2012-05-15T08:16:27.467 に答える
1

ログイン応答データをサーバーまたはセッションのどこかに保存する必要があります。JavaScript はクライアント側の言語であるため、取得された値は更新間で保持されません。

結果を保存し、php でページを生成するときに存在するかどうかを確認することをお勧めします。もしそうなら、データを記入してください..など

于 2012-05-15T08:01:30.483 に答える