ホームページ >php教程 >php手册 >Cookie を捨てて SESSION を使用する - PHP で SESSION がページをまたいで渡せない問題の解決策

Cookie を捨てて SESSION を使用する - PHP で SESSION がページをまたいで渡せない問題の解決策

WBOY
WBOYオリジナル
2016-06-21 09:15:411016ブラウズ

クッキー|セッション|解決|問題

Cookie を脇に置き、セッションを使用します
PHP で SESSION をページ間で渡せない問題の解決策

PHP で SESSION を使用したことがある友人は、SESSION 変数をページ間で渡せないという問題に遭遇する可能性があります。これには数日間悩みましたが、情報を調べて最終的に問題を解決しました。この問題の原因は次のとおりだと思います:
1. クライアントで Cookie が無効になっている
2. ブラウザーに問題があり、一時的に Cookie にアクセスできない
3. php.ini の session.use_trans_sid = 0またはコンパイル時に --enable-trans-sid オプションがオンになっていません

なぜこれが起こっているのでしょうか?以下に説明します:
セッションはサーバー側に保存されます (デフォルトではセッションはファイルとして保存されます)。クライアントから提供されたセッション ID に従ってユーザーのファイルが取得され、変数の値が取得されます。 id はクライアントの Cookie または Http1.1 プロトコルを使用して Query_String (アクセスされた URL の "?" 以降の部分) をサーバーに送信し、サーバーはセッション ディレクトリを読み取ります。つまり、セッションIDはサービス上に保存されているセッション変数を取得するためのIDカードです。 session_start(); コードが実行されると、サーバー上にセッション ファイルが生成され、それに一意に対応するセッション ID が生成され、生成されたセッション ファイルに特定の形式で格納されるように定義されます。セッション ID を通じて、定義された変数を取得できます。ページを通過した後、セッションを使用するには、session_start() を再度実行する必要があります。別のセッション ファイルが生成され、それに応じて、このセッション ID を使用して最初のセッション ファイルを取得することはできません。このセッション ID はそれを開くための「キー」ではないため、変数を入力します。 session_start(); の前にコード session_id($session id); を追加すると、新しいセッション ファイルは生成されず、この ID に対応するセッション ファイルが直接読み取られます。
PHP のセッションは、デフォルトでクライアントの Cookie を使用してセッション ID を保存するため、クライアントの Cookie に問題があると、セッションに影響します。セッションは必ずしも Cookie に依存する必要はないことに注意してください。これが、Cookie と比較したセッションの優れた点でもあります。クライアントの Cookie が無効になっている場合、または問題が発生している場合、PHP は自動的にセッション ID を URL に付加し、セッション ID を介してセッション変数をページ間で使用できるようにします。ただし、この添付ファイルには特定の条件もあります。つまり、「php.ini の session.use_trans_sid = 1、またはコンパイル中に --enable-trans-sid オプションがオンになっている」です。

上記の原則を理解した上で、Cookie を脇に置いてセッションを使用しましょう。主な方法は 3 つあります:

1. php.ini で session.use_trans_sid = 1 を設定するか、コンパイル中に --enable-trans-sid オプションをオンにします。 PHP がページ間でセッション ID を自動的に受け渡せるようにします。
2. URL を通じて値を手動で渡し、非表示のフォームを通じてセッション ID を渡します。
3. session_id をファイル、データベースなどに保存し、クロスページプロセス中に手動で呼び出します。

例で説明しましょう:

s1.php

session_start();
$_SESSION['var1']="中華人民共和国";
$url="次のページ";
echo $url;
?>

s2.php

session_start();
echo "渡されたセッションの値変数 var1 の「.$_SESSION['var1'];
?>

上記のコードを実行します。クライアント Cookie が正常であれば、結果「中華人民共和国」を取得できるはずです。
ここで、クライアント上の Cookie を手動で閉じて再度実行すると、結果が得られない可能性があります。結果が得られない場合は、php.ini で session.use_trans_sid = 1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにすると、「中華人民共和国」という結果が得られます

上記の言い方1です。

以下のアプローチ 2 について説明します:

変更されたコードは次のとおりです:
s1.php

session_start();
$_SESSION['var1']="中華人民共和国";
$sn = session_id( );
$url="次のページ";
echo $url;
?>

s2.php

session_id($_GET['s']);
session_start();
echo "渡されたセッション変数 var1 の値は次のとおりです: ".$_SESSION[' var1'];
?>

方法 3 を例を挙げて説明します。 html>
< ;head>
ログイン

< ;/head>

ログインしてください:


ユーザー名:

パスワード:






mylogin1.php


$name=$ _POST['name'];
$pass=$_POST['pass'];
if(!$name || !$pass) {
echo "ユーザー名またはパスワードが空です。再度ログイン";
die();
}
if (!($name=="laogong" && $pass=="123")) {
echo "ユーザー名またはパスワードは間違っています。再度ログインしてください";
die();
}
//登録ユーザー
ob_start();
session_start();
$ _SESSION[ 'ユーザー']= $name;
$psid=session_id();
$fp=fopen("e:\tmp\phpsid.txt","w+");
fwrite($fp,$psid); ($fp);
//認証に成功しました。関連する操作を実行します
echo "ログイン
";
echo "次のページ
? >

mylogin2.php

$fp=fopen("e:\tmp\phpsid.txt","r");
$sid=fread($fp, 1024);
fclose( $fp);
session_id($sid);
session_start();
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {

echo "すでにログインしています!";
}
else {
//関連操作を実行するために正常にログインしました
echo "ログインしていません。アクセス権がありません";
echo "
ログイン< ;/a>後で参照";
die();
}

?>

また、Cookie テストをオフにしてください。ユーザー名: laogong パスワード: 123 これは、セッション ID をファイルに保存するためのもので、ファイルは e:tmpphpsid です。 txt のファイル名またはパスはシステムに応じて決定してください。

データベース方式については例は出しませんが、ファイル方式と同様です。

要約すると、上記のメソッドには共通点が 1 つあります。それは、前のページでセッション ID を取得し、それを次のページに渡す方法を見つけることです。 session_start(); コードは次のページにあります。 );

注: 私のテスト環境: Win2K サーバー Aapache 1.3.31 PHP 4.3.4

さらに、lidm は Unix 系のシステムでもテストされています