3

PHPの問題を診断しようとしています。配列に値を渡して$_SESSIONいますが、それらの値は配列に取り込まれません。以前var_dump($_SESSION)は何が返されているかを確認していましたが、array (0){}. これは、セッションが設定され、値が配列に追加されていることがわかっている場合でも当てはまります。

これが私のコード(index.php)の簡略化されたバージョンです:

<?php
session_start();
var_dump($_SESSION); 

if ($_REQUEST['query'] == "" or is_null($_REQUEST['query'])) {
$errormsg = "You must enter a search term to query.  Please try again.";
}

?>

<form name="product_search" id="product_search" method="post" action="index.php">
<input size="60" type="text" name="query" id="query" <?php echo "value=\"" .  $_REQUEST['query'] . "\" "; ?>/>
<?php if (isset($errormsg)) {echo "<span class=\"errormsg\">" . $errormsg . "</span>";} ?>
<input type="submit" class="searchBtn" value="Search"/>

<?php
    $_SESSION['query'] = 'foo';
    $_SESSION['search_field'] = 'man';
    $_SESSION['results'] = 'chu';
?>

var_dump($_SESSION); //Will dump array(3) {...}

エラーを再現するには:

  1. ページをロードします。ここでは問題ありません。var_dump($_SESSION)一番上の は を返しますがarray(0) {}、これは予想どおりであり、一番下の も予想通り 3 メンバーの配列を返します。
  2. クエリ フィールドに何かを入力してフォームを送信します (検証を無効にするため)。$_SESSION前回のページ読み込みで設定された変数にもかかわらず、最初のダンプはまだ を返しますarray(0) {}

問題を解決するためにここでコードを単純化しましたが、問題なく $_SESSION 変数を返す別のページがあります (最初のページではvar_dump1 メンバーの配列が生成されます)。$_SESSIONここでフォームをそれ自体に送信しているという問題がありますか?もしそうなら、あるページの読み込みから次のページに値を渡すための配列以外の方法はありますか? 私は PHP のドキュメントを見て、高低を検索しましたが、助けになるものは何も見つかりませんでした。

また、セッション ID はページの読み込み間で同じであるため、ページの読み込みからページの読み込みまでセッション状態が維持されているように見えることにも注意してください。

助けてくれてありがとう。

4

6 に答える 6

4

各 Web ページの上部で次の行を使用します。

if (!isset($_SESSION)) { session_start(); }

下位レベルのスクリプトに初期化$_SESSIONすると、上位レベルで `$_SESSION 変数にアクセスできなくなります。

于 2014-07-27T15:59:55.023 に答える
2

session.cookie_secure = 1 はこの問題を引き起こす可能性があります

UPD: 非セキュア接続の場合、session.cookie_secure が 0 に設定されていることを確認してください。

ini_set('session.cookie_secure', '0')

私のために働いた。

UPD: 同様の質問PHP session.cookie_secure: Disables sessions when set to true

于 2015-07-16T03:42:10.810 に答える
0

セッションは適切に有効化されていますか? PHP サーバー セッション設定のドキュメントは次のとおりです http://www.php.net/manual/en/session.configuration.php

ジェレミーの答えに加えて、Cookie を拒否することもできます。

于 2012-05-09T15:40:21.390 に答える
0

サーバー構成でセッション Cookie が許可されていることを確認してください。

session.use_cookies = 1

別の方法は、セッション ID が GET で渡されることです。それをフォーム アクションに具体的に追加する必要がありますが、これは行っていません。したがって、値がポストされるとセッションはありません。

于 2012-05-09T15:36:46.793 に答える
0

SESSION の代わりに POST をとにかく使用しているため、変数とその値を 1 つ (または複数) の非表示の入力にパックするだけで使用できます (1 つの送信から POST をシリアル化し、非表示の入力に挿入するか、またはできるだけ多くの非表示の入力を作成します最初の送信からの変数があります)。次に、2番目の送信(おそらくマルチステップフォームの2番目のステップ)で、新しいデータを投稿し、もちろん最初の送信からのデータを投稿します...

しかし、セッションの方が簡単なので、まだセッションを好みます (より多くのコードを実装する必要はありません)。

各ページの読み込み/送信で SESSION が再生成されていないことを確認していますか? ページの読み込み/送信時にセッション ID を再生成すると、古いセッション (データを含む) が失われ、データが新しいセッション ID の下に挿入されます...

また、推奨事項: $_REQUEST が完全に必要であると確信していない限り忘れて、適切なチャネルからデータを取得するために $_GET または $_POST のみを使用してください...

于 2012-05-09T15:40:57.483 に答える
0

これはゲームにとって少し遅れており、誰もこの構成の問題に遭遇していない可能性があります. 実際、そうではないことを願っています。

私の Web ホストは、すべてのサイトを新しいサーバーに移動しました。彼らは、ファイルとディレクトリのアクセス許可、および webserver と php スクリプトを実行するユーザーをめちゃくちゃにしました。

どうやら

session.auto_start = 1

フラグを使用すると、0 に設定して単に

session_start();

私のスクリプトで。

驚くべきパーミッションの問題は、セッション ファイルが書き込まれているが、読み取ることができないことです。そのため、自動開始セッションは常に空です。

于 2017-06-14T20:20:47.903 に答える