0

ですから、Cookieを使用するのはこれが初めてで、Cookieの設定に問題があります。私はすべてを正しくやっていると思います(しかし、あなたはプログラミングがどのようになり得るかを知っています)。jquery.ajaxとにかく、あるphpスクリプト(autologin.php)を呼び出してvalidateLogin.js、別のスクリプト(login.php)の関数を使用して、ユーザーとそのパスワードがデータベースにあるかどうかを確認するログインシステムを作成しています。login.phpユーザーが存在し、パスワードが同じである場合、Cookieが設定され、いくつかのjsonデータが返されautologin.php、その後、元のjquery.ajaxメソッドsuccess関数にさらにいくつかのjsonデータが返されます。次に、success関数はにリダイレクトされuserarea.htmlます。ここで、js関数はユーザーデータを自動的にロードして、使用できるようにします。これは、別のajax呼び出しで行われますloaduserdata.jswhichはwhichを呼び出し、loaduserdata.phpチェックしisset($_COOKIE['user']てから、何が起こったかに応じていくつかのjsonデータを返します。ただし、isset($_COOKIE['user']失敗し、コンソールまたはログ(php、mysql、apache)のいずれにもエラーが表示されません。だから私は本当に困惑しています。これが私のコードです:

validateLogin.js

function validateLogin(){
  $(document).ready(function(){
    $("#loginform").submit(function(){
      $.ajax({
        type: "POST",
        url: "./php/autologin.php",
        data: {
          'login': $("#login").val(), 
          'password': $("#password").val()
        },
        dataType: "json",
        success:function(data){
          if(data.status == "success"){
            alert(data.message);
            window.location = "./userarea.html";
          } else if (data.status == "error"){
            alert(data.message);
          }
        },
        error:function(thrownError){
          console.log(thrownError);
        }
      }); 
      return false;
    });

  });
}

autologin.php

<?php

include './login.php';
$login = $_POST['login'];
$password = $_POST['password'];
$loginattempt = login($login, $password);
$loginattemptdata = json_decode($loginattempt);
if ($loginattemptdata->{'status'} === "success") {
  echo json_encode(array('status' => "success", 'user' => $loginattemptdata->{"user"}, 'message' => "Login Successful!"));
  die();
} else {
  echo json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => $loginattemptdata->{"message"}));
  die();
}
?>

login.php

<?php
include './connect_to_mysql.php';

function login($log, $pass) {
  $link = connect_to_mysql();
  $linkdata = json_decode($link);
  if ($linkdata->{'status'} === "success") {
    $sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
    if (mysql_num_rows($sqlquery) == 1) {
      setcookie("user", $log, 86400, '/', 'localhost');
      return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
      die();
    } else {
      return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
      die();
    }
  } else {
    return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
    die();
  }
}

?>

loaduserdata.js

$(document).ready(function(){
  $.ajax({
    type:"POST",
    url:"./php/loaduserdata.php",
    success:function(data){
      if(data.status === "success"){
        alert(data.status);
        alert(data.user);
      } else if (data.status === "error"){
        alert(data.status);
        alert(data.message);
        window.location = "./index.html";
      }
    },
    error:function(thrownError){
      console.log(thrownError);
    }
  });
});

loaduserdata.php

<?php
if (isset($_COOKIE['user'])) {
  $user = $_COOKIE['user'];
  echo json_encode(array('status' => "success", 'message' => $user));
  die();
} else {
  echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
  die();
}
?>

私が読んだことから、新しいスクリプトで利用できるようにCookieを設定した後、更新またはリダイレクトする必要があります。これが私が行っていることだと思います。どんな助けや指示も大歓迎です。ありがとう!

4

1 に答える 1

1

ログインステータスをクライアント側のCookieに依存することはお勧めできません。ユーザーがランダムな(有効な)ユーザー名で自分のCookieを作成するとどうなるか想像してみてください。彼はパスワードを必要とせずにあなたのシステムにアクセスできるようになります。

$ _SESSIONベースの認証手順に切り替えることを検討しましたか?

コンセプトは、すべての訪問者に一意のID(セッションID)が割り当てられ、Cookieクライアント側として保存されるというものです。訪問者がページをロードすると、sessid cookieが渡され、phpがセッションストレージ(セッションをまだ構成していない場合は/ tmp /内のファイル)からページをロードします。このファイルは$_SESSION変数に反映され、対応するセッションIDにのみアクセスできるデータを保存できます。したがって、ユーザー名またはログインステータスはサーバー側で処理され、クライアント側では処理されません。

<?php
# login.php
include './connect_to_mysql.php';

function login($log, $pass) {
  $link = connect_to_mysql();
  $linkdata = json_decode($link);
  if ($linkdata->{'status'} === "success") {
    $sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
    if (mysql_num_rows($sqlquery) == 1) {
      session_start();
      $_SESSION['user'] = $log;
      return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
    } else {
      return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
    }
  } else {
    return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
  }
}
?>

変更点:(1)返却後にdie()をドロップします。それらは決して実行されません。(2)session_start()および$ _SESSION ['user'] =$logを介してセッションに保存します。独自のCookieを使用する代わりに。

<?php
# loaduserdata.php
session_start();
if (isset($_SESSION['user'])) {
  $user = $_SESSION['user'];
  echo json_encode(array('status' => "success", 'message' => $user));
  die();
} else {
  echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
  die();
}
?>

変更:クライアント側のCookieに依存するのではなく、session_start()と$_SESSION['user']を使用します。

于 2012-06-17T20:45:37.357 に答える