PHP でセッションをページ間で転送できない理由: 1. クライアントが Cookie を無効にしている、2. ブラウザが一時的に Cookie を取得できない、3. PHP の [session.use_trans_sid = 0]。 ini ファイルのオプションが設定されていません。
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 を使用することはできません。このセッション 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
<?php session_start(); $_SESSION[’var1’]="中华人民共和国"; $url="<ahref=".""s2.php">下一页</a>"; echo$url; ?>
s2.php
<?php session_start(); echo"传递的session变量var1的值为:".$_SESSION[’var1’]; ?>
上記のコードを実行し、クライアントを使用します。 cookie 通常の状況では、「中華人民共和国」という結果が得られるはずです。
ここで、クライアント上の Cookie を手動で閉じて再度実行すると、結果が得られない可能性があります。結果が得られない場合は、php.ini で session.use_trans_sid = 1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにすると、「中華人民共和国」という結果が得られます。 🎜>
これが上記のアプローチ 1 です。 以下のアプローチ 2 について説明します。 変更されたコードは次のとおりです。 s1.php<?php session_start(); $_SESSION[’var1’]="中华人民共和国"; $sn=session_id(); $url="<ahref=".""s2.php?s=".$sn."">下一页</a>"; echo$url; ?>
<?php session_id($_GET[’s’]); session_start(); echo"传递的session变量var1的值为:".$_SESSION[’var1’]; ?>
パス 3 の例:
login.html
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <title>Login</title> <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"> </head> <body> 请登录: <formname="login"method="post"action="mylogin1.php"> 用户名:<inputtype="text"name="name"><br> 口 令:<inputtype="password"name="pass"><br> <inputtype="submit"value="登录"> </form> </body> </html>
mylogin1.php
<?php $name=$_POST[’name’]; $pass=$_POST[’pass’]; if(!$name||!$pass){ echo"用户名或密码为空,请<ahref="login.html">重新登录</a>"; die(); } if(!($name=="laogong"&&$pass=="123"){ echo"用户名或密码不正确,请<ahref="login.html">重新登录</a>"; die(); } //注册用户 ob_start(); session_start(); $_SESSION[’user’]=$name; $psid=session_id(); $fp=fopen("e:\tmp\phpsid.txt","w+"; fwrite($fp,$psid); fclose($fp); //身份验证成功,进行相关操作 echo"已登录<br>"; echo"<ahref="mylogin2.php">下一页</a>"; ?>
mylogin2.php
<?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"请<ahref="login.html">登录</a>后浏览"; die(); } ?>