1

これについて以前に投稿したところ、問題を修正したと思っていた間違いを修正する良い反応が得られました。残念ながらそうではありませんでした.私の古い投稿は十分に乱雑であるため、問題を再投稿します.

コード (簡略化):

<?php
session_start();

if (!$_SESSION["companyid"]) {

header("location: http://www.somepage.com");

}

mysql_connect("localhost", "name", "password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

$companyid = $_SESSION["companyid"];

$_SESSION["youtubeurl"] = mysql_real_escape_string($_POST["youtubeurl"]);
$_SESSION["logourl"] = mysql_real_escape_string($_POST["logourl"]);

$_SESSION["plan1head"] = mysql_real_escape_string($_POST["plan1head"]);
$_SESSION["plan1description"] = mysql_real_escape_string($_POST["plan1description"]);
$_SESSION["plan1headline1"] = mysql_real_escape_string($_POST["plan1headline1"]);
$_SESSION["plan1price1"] = mysql_real_escape_string($_POST["plan1price1"]);
$_SESSION["plan1headline2"] = mysql_real_escape_string($_POST["plan1headline2"]);
$_SESSION["plan1price2"] = mysql_real_escape_string($_POST["plan1price2"]);
$_SESSION["plan1price1type"] = mysql_real_escape_string($_POST["plan1price1type"]);
$_SESSION["plan1price2type"] = mysql_real_escape_string($_POST["plan1price2type"]);

if(isset($_POST["submitpreview"])) {

$companyid = $_SESSION["companyid"];

$youtubeurl = $_SESSION["youtubeurl"];
$logourl = $_SESSION["logourl"];
$plan1head = $_SESSION["plan1head"];
$plan1description = $_SESSION["plan1description"];
$plan1headline1 = $_SESSION["plan1headline1"];
$plan1price1 = $_SESSION["plan1price1"];
$plan1headline2 = $_SESSION["plan1headline2"];
$plan1price2 = $_SESSION["plan1price2"];
$plan1price1type = $_SESSION["plan1price1type"];
$plan1price2type = $_SESSION["plan1price2type"];

}

?>

現在、これに関連する 3 つのページ/インスタンスがあります。

  1. 変数をプレビュー ページに渡すフォームを含むページ
  2. プレビューページ
  3. 送信されたプレビュー ページ (ページが更新されたことを意味します)

ユーザーには、さまざまなテキスト フィールドとドロップダウン メニューで満たされた独自のページがあります (ページ 1)。ユーザーはこのページを更新できます。フォームに入力して送信すると、それらの変数がプレビュー ページに渡されます。プレビュー ページが気に入った場合は、それを確認します (「submitpreview」を実行するフォームを送信します)。

ここに私の問題があります: フォームによって入力されるすべてのセッション変数 (最初のログイン時にセッションに保存される会社 ID 以外のすべて) は、すぐにセッション変数にダンプされます。プレビュー ページの下部でこれらのセッション変数をエコーアウトしました (この時点で空でないことを確認するため)。プレビュー ページに到達すると、その内容が適切にエコーアウトされます。ただし、ユーザーが変更を確認し、submitpreview が設定されていると、それらのセッション変数が突然空になります。つまり、フォーム変数によって埋められたすべてのセッション変数は空です。ページが更新される前に正常にエコーアウトされたセッション変数は、companyid 変数を除いてなくなりました。companyid セッション変数はまだ問題ないので、したがって、(1)サーバー上のセッションが正しく機能している必要があり、(2)フォーム変数をセッションにダンプするか、それらの変数を取得するコードに問題があることを知っています。なぜこれが起こっているのかについての理論はありますか?

これは私をかなりイライラさせます。この問題について、ご理解とご協力を賜りますようお願い申し上げます。

4

2 に答える 2

1

それを理解したので、共有したいと思いました。

このような例では、更新されるページの投稿変数と同じセッション変数がある場合は注意が必要です。プレビュー ページが更新されると、投稿変数が (存在しなくなったため) 空になり、以前に保存したセッション変数の情報が上書きされ、それらのセッション変数も空になりました。その問題を解決するには、それに応じてコードを調整する必要がありました。

于 2013-02-11T20:31:53.597 に答える
0

Pete_1 の回答で説明されているように、この問題は register_globals が原因です。これにより、同じ名前の異なる変数が混在することになります。これ:

foreach ($_SESSION AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}
foreach ($_POST AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}
foreach ($_GET AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}

register_globals を非アクティブ化する手段がない場合、問題は解決します。

于 2015-01-09T09:30:50.397 に答える