-2

jQueryとPHPを使用して認証システムを実装しようとしています。すべてのphp作業は、コントローラーおよびデータハンドラークラスで行われます。.htmlファイル内にphpコードはありません。.htmlファイルのすべての値は、phpサーバーからのデータを要求するjQueryを介してレンダリングされます。だから私がやろうとしているのは:

  1. ユーザーがログインボタンをクリックすると、jQueryはコントローラークラスのauthenticate()メソッドを呼び出し、ユーザーが正しいかどうかを確認します。正しい場合は、セッションを開始し、セッションにuser_idを設定します。後でアクセスでき、userIdをjQueryクライアントに再度返します。
  2. その後、すべてがうまくいけば、jQueryでそれをhtmlファイルにリダイレクトします。htmlファイルで、<script>他の権限を処理するタグからjQueryを呼び出します。ただし、このjQueryは(authenticate()前述の同じクラスのメソッドから)メソッドgetPermissionStringにアクセスするため、authenticateメソッドで設定されたセッション値を取得する必要があります。

問題:

内部のセッション値を取得しようとすると、次のようにgetPermissionString()なります。

注意:未定義の変数:_SESSION

2番目の方法でセッションが登録されているかどうかを確認しようとしましたが、登録されていないようです。これが私のPHPコードです。

何か案が?ありがとう。

public function authenticate($login, $password)
{
    $result = $this->userDataHandler->authenticateUser($login, $password);

    if(is_numeric($result) && $result != 0) 
    {
        session_start();
        $_SESSION["uid"] = $result;

        if(isset($_SESSION["uid"]))
        {
            echo "registered";
            $userId = $_SESSION["uid"]; 
        }
        else
        {
            echo "not registered";  
        }

        echo $result;
    }
    else
    {
        echo 0; 
    }
}

public function getPermissionString()
{
    if(isset($_SESSION["uid"]))
    {
        echo "registered";
        $userId = $_SESSION["uid"]; 
    }
    else
    {
        echo "not registered";  
    }
}
4

4 に答える 4

2

2番目の関数にアクセスする前に、プログラムが事前$_SESSIONに呼び出していることを確認する必要があります。session_start()グローバル変数は、セッションがアクティブ化されたときにのみ入力されます。使用する前にセッションを開始することを忘れた場合は、以下のphp.ini変数を変更できます。

[session]
session.auto_start = 1

さらに、コードにクラスを使用しているとのことです。この場合、マジックメソッドを使用してクラスが作成されるたびにセッションを自動スタートすることもできます。

class auth {
  function __construct() {
    session_start();
  }
  function yourfunction() {
    ...
  }
  function yoursecondfunction(){
    ...
  }
}
于 2012-05-28T19:25:14.413 に答える
1

セッションが開始されていない場合は、その機能を使用しないでください。したがって、例外をスローします。

public function getPermissionString()
{
    if (session_status() !== PHP_SESSION_ACTIVE)
    {
        throw new Exception('No active session found.');
    }

    if(isset($_SESSION["uid"]))
    {
        echo "registered";
        $userId = $_SESSION["uid"]; 
    }
    else
    {
        echo "not registered";  
    }
}

これにより、関数の前提条件が関数内でチェックされるため、関数を呼び出す前に毎回チェックする必要がなくなります。

その関数を誤って使用すると例外が表示され、コードをより簡単に分析できるようにバックトレースが提供されます。

于 2012-05-28T19:28:07.527 に答える
1

session.auto_startを有効にしておらず、2つの異なるリクエストでauthenticategetPermissionStringが呼び出される場合は、各関数でsession_start()を呼び出す必要があります。

セッションIDの受け渡し方法の詳細が必要な場合は、「セッションIDの受け渡し」をお読みください。

于 2012-05-28T19:20:21.507 に答える
0

PHPセッションを機能session_start()させるには、ブラウザからスクリプトが要求されるたびに呼び出す必要があります。

于 2012-05-28T19:15:26.143 に答える