ホームページ  >  記事  >  バックエンド開発  >  PHP ではセッションをページ間で受け渡すことができないのはなぜですか?

PHP ではセッションをページ間で受け渡すことができないのはなぜですか?

PHPz
PHPzオリジナル
2016-06-20 13:03:261114ブラウズ

PHP でセッションをページ間で転送できない理由: 1. クライアントが Cookie を無効にしている、2. ブラウザが一時的に Cookie を取得できない、3. PHP の [session.use_trans_sid = 0]。 ini ファイルのオプションが設定されていません。

PHP ではセッションをページ間で受け渡すことができないのはなぜですか?

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;
?>
s2.php

<?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();
}
?>
また、Cookie テストをオフにしてください。ユーザー名: laogong パスワード: 123 これは、ファイルを通じてセッション ID を保存するためのものです。 e: mpphpsid.txt です。システムに応じてファイル名またはパスを決定してください。

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。