PHPでSESSIONがページをまたいで受け渡せない問題の解決策
PHP で SESSION を使用している友人は、SESSION 変数をページ間で渡すことができないという問題に遭遇する可能性があります。これには数日間悩みましたが、情報を調べて最終的に問題を考え、解決しました。この問題の理由は次のとおりだと思います。
1. クライアントで Cookie が無効になっていますか?
2. ブラウザに問題があり、Cookie に一時的にアクセスできませんか?
3. php.ini の Session.use_trans_sid?=?0 またはコンパイル時に --enable-trans-sid オプションがオンになっていませんか?
なぜこのようなことが起こっているのでしょうか?以下で説明しましょう:?
セッションはサーバー側に保存されます (デフォルトではセッションはファイルとして保存されます)。クライアントから提供された session?id に従ってユーザーのファイルが取得され、変数の値が取得されます。 session?id にはクライアントの Cookie または Http1.1 プロトコルの Query_String (つまり、アクセスされた URL の "?" 以降の部分) がサーバーに送信され、サーバーはセッション ディレクトリを読み取ります。つまり、session?id はサービスに保存されているセッション変数を取得する ID カードです。コードを書くとき
session_start(); が実行されると、サーバー上にセッション ファイルが生成され、それに一意に対応する session?id も生成され、定義されます。
セッション変数は、生成されたばかりのセッション ファイルに特定の形式で保存されます。 session?id を通じて、定義された変数を取得できます。ページを移動した後、セッションを使用するには、session_start() を再度実行する必要があります。これに対応して、対応する session?id が生成されます。
この session?id はファイルを開くための「キー」ではないため、前述の最初のセッション ファイル内の変数を取り出すことは不可能です。 session_start(); の前にコード session_id($session?id); を追加すると、新しいセッション ファイルは生成されず、この ID に対応するセッション ファイルが直接読み取られます。 ?
PHP のセッションは、デフォルトでクライアントの Cookie を使用してセッション ID を保存するため、クライアントの Cookie に問題があると、セッションに影響します。セッションは必ずしも Cookie に依存する必要はないことに注意する必要があります。これが、Cookie と比較したセッションの優れた点でもあります。クライアントが
Cookie が無効になっている場合、または問題が発生した場合、PHP は自動的に session?id を URL に付加し、session?id を通じてセッション変数をページ間で使用できるようにします。ただし、この添付ファイルには特定の条件もあります。つまり、「php.ini の session.use_trans_sid?=?1、またはコンパイル中に --enable- がオンになっている」
トランスサイドオプション」。
フォーラムを使用したことのある友人は、フォーラムに参加するときに、Cookie がオンになっているかどうかを確認するメッセージが頻繁に表示されることを知っています。これは、ほとんどのフォーラムが Cookie に基づいており、フォーラムではユーザー名と情報を保存するために Cookie が使用されるためです。使いやすさのためのパスワードやその他のユーザー情報。そして多くの友人は、Cookie は安全ではないと考えており (実際には安全ではありません)、Cookie を無効にすることがよくあります。実際、PHP プログラムでは次のように使用できます。
SESSION は Cookie を置き換えます。これは、クライアントが Cookie をオンにするかどうかには依存しません。 ?
したがって、Cookie を脇に置いてセッションを使用できます。つまり、ユーザーが Cookie をオフにしてセッションを使用すると仮定します。これを実現するには、いくつかの方法があります。
1. php.ini で session.use_trans_sid?=?1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにして、PHP がページ間で session?id を自動的に渡すようにします。 ?
2. URL を通じて値を手動で渡し、非表示のフォームで session?id を渡します。 ?
3. session_id をファイル、データベースなどに保存し、クロスページ プロセス中に手動で呼び出します。 ?
パス 1 の例:?
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 オプションをオンにすると、「中華人民共和国」という結果が得られます。 「?
パス 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 の例:
login.html?
?
?
?
?
ログインしてください:?
?
?
?
$name=$_POST['name'];
$pass=$_POST['pass'];?
if(!$name?||?!$pass)?{?
????echo?"ユーザー名またはパスワードが空です。再度ログインしてください";?
??die();?
}?
if?(!($name=="laogong"?&&?$pass=="123")?
????echo?"ユーザー名またはパスワードが間違っています。再度ログインしてください";?
???die();?
}?
ob_start();?
session_start();?
$_SESSION['user']=?$name;?
$psid=session_id();?
$fp=fopen("e:tmpphpsid.txt","w+";?
fwrite($fp,$psid);?
fclose($fp);?
//本人確認が成功しました。関連する操作を実行しますか?
echo?"ログイン
";?
エコー?"次のページ";?
?>?
mylogin2.php?
$fp=fopen("e:tmpphpsid.txt","r";?
$sid=fread($fp,1024);?
fclose($fp);
セッション ID($sid);?
session_start();?
if(isset($_SESSION[’user’])?&&?$_SESSION[’user’]="老公"??{?
????
????echo?"すでにログインしています!";?
}?
else?{?
????// 実行に成功しました関連する操作?
????echo?「ログインしていません。アクセス権がありません」;?
????echo?"ログインして閲覧してください";?
????die();?
}?
?>
ユーザー名: laogong? パスワード: 123?? ファイル名は e:?mpphpsid.txt です。独自のシステムまたはパスに応じて。 ?
データベース方式については例を挙げませんが、ファイル方式と同様です。 ?
要約すると、上記のメソッドには 1 つの共通点があります。それは、前のページで session?id を取得し、それを次のページに渡す方法を見つけて、コード session_id(次のページの session_start(); コードの前に渡されました session?id);?