2

$_SESSION 変数を使用して、私の Web サイトに PHP 認証システムがあります。

フォームは、ユーザー名とパスワードをファイル「login.php」に送信します。次のように処理されます。

<?php include '../includes/sessionstart.inc.php'; ?>
<?php ob_start(); ?>

if($_POST){
    $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
    if(mysql_num_rows($q) >= 1){
        $f = mysql_fetch_Array($q);
        $_SESSION['company'] = $f['company'];
        $_SESSION['id'] = $f['id'];
        $_SESSION['logedin'] = true;
        session_write_close();

        ob_clean();
        header("Location: index.php");

}

その後、index.php が読み込まれ、「logedin」が true かどうかがチェックされます。

<?php include '../includes/sessionstart.inc.php'; ?>
<?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>

私の運用サーバーでは続行しますが、私の Wampserver では login.php に戻ります。Wampserver のページ読み込みが非常に遅いことに気付きました。そのため、ページが切り替わる前にセッション データが確実に保存されるように、session_write_close を含めましたが、役に立ちません。

session_start.inc.php の内容は次のとおりです。

<?php
    session_start();
?>

そこにはもっと多くのコードがありましたが、現時点ではこれだけです。この問題は、インクルード ファイルの使用を開始する前にも存在していました。

誰かが私が間違っていることを知っていますか? Wampserver が私の SESSION データを次の PHP ファイルに送信しないのはなぜですか?

4

7 に答える 7

6

$_SESSIONWAMPサーバー2-デフォルトでは、 varの設定は設定されていません。

PHP.ini には次の設定が必要です

C:\wamp\bin\apache\apache2.4.2\bin\php.ini
session.cookie_domain =
session.use_cookies = 1
session.save_path = "c:\wamp\tmp"   ;ensure the \ is used not /

セッションテスト --load.php--loadvar $_SESSION

<?PHP
session_start();
$_SESSION['SESS_MEMBER_ID'] = 'stored variable';
session_write_close();
header("location:print.php");
?>

print.php --print $_SESSIONvar。

<?PHP
session_start();
var_dump($_SESSION);
?>

ブラウザでスクリプトを実行すると、var_dump()結果が生成されます

に移動しc:\wamp\tmpます。セッションデータを含むファイルがここに表示されます。

于 2012-11-29T12:47:58.287 に答える
2

まず第一に、logedinログインしているユーザーを追跡するためのインデックスは奇妙に思えます。これは単なるSOのタイプミスですか、それとも本当にコードのタイプミスですか?

次に (目的の動作に応じて)、ページをログイン保護する別の方法を試してください。あなたのページは次のようになります

<?php
  include 'login.inc.php';

  if(authorized()) {
    // put some more script here, if needed
    ?>
    // put some plain HTML here  
    <?php
  }
?>

login.inc.phpセッション、Cookie を処理する場所。特に、authorizedクライアントがすでにログインしている場合、この関数は TRUE を返す必要があります。クライアントがログインしていない場合、アクションを含むフォームを表示し、$_SERVER['PHP_SELF']FALSE を返す必要があります。submit-input に のような名前を付けると、検証を処理login_submitできます。login.inc.php

これにより、ユーザーを専用のログイン ページに誘導する必要がなくなり、ログイン後、要求されたページがユーザーに直接表示されます。これを少し調整して、ログインを通じてクエリ文字列を永続化することもできます。

于 2010-01-28T09:44:17.013 に答える
1

/localhost での開発に WAMPSERVER を使用すると、この問題が発生しました。session.use_only_cookiesインラインまたはphp.ini設定で変更する必要がありました

session.use_only_cookies = 1

session.use_only_cookies = 0

説明

デフォルトの Cookie ベースのセッションの使用は期待どおりに機能していましたが、Cookie を使用しないソリューションが必要でした。テスト開始ページ:

<?php
// page1.php

ini_set('session.use_cookies', '0');
session_start();

$_SESSION['time'] = time();

echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

セッション データが作成され、WAMPSERVER temp ディレクトリに正常に保存されましたC:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16。上記のコードによって生成されるリンクは次のようになります (UID がセッション データ ファイル名と一致することに注意してください)。

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

しかし、宛先 page2.php は、セッション データを取得しようとしているときに、変数 'time' に対して未定義のエラーをスローしていました。

<?php
// page2.php

ini_set('session.use_cookies', '0');
session_start();

echo date('Y m d H:i:s', $_SESSION['time']);

echo '<br /><a href="page1.php?' . SID . '">page 1</a>';
?>

session.use_only_cookies前のいずれかのスクリプトで FALSE を設定することによりsession_start();:

ini_set('session.use_only_cookies', '0');

またはでグローバルに変更しphp.iniます:

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combatting
; session hijacking when not specifying and managing your own session id. It is
; not the end all be all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 0

問題を解決しました。

于 2011-12-07T15:47:11.337 に答える
1

交換してみる

if($_POST){...}

if( isset($_POST['username']) && isset($_POST['password']) ){...}

...少なくともデバッグ目的で。いくつかの異なる設定が原因で、空でない $_POST 配列が予期されない場所で発生している可能性があります。

また、リダイレクトexit()後にコードに呼び出しがないようです。header()HTTP Locationヘッダーを送信しても、スクリプトは自動的に停止しません。

于 2010-01-28T10:39:31.577 に答える
0

WAMP 2.5 にアップデートすると、問題は解決しました!

于 2015-05-19T16:32:36.290 に答える
0

長い間、私はついにこのバグを修正しました。

私の localhost WAMP では、セッション データが Cookie に保存され、localhost に設定する Cookie ドメインがないため、セッション データはページの読み込み間で保存されません。

ソリューション:

「session.cookie_domain」は、「localhost」だけでなく、すべてのローカル ドメイン名に対して空の文字列に設定する必要があります (ただし、ローカル IP アドレスに対しては空にしないでください)。

<?php
ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>

ここに投稿してくれた Marcin Wiazowski に感謝します。

于 2010-08-25T18:43:01.770 に答える