ローカル環境で動くのに本番環境で動かない(セッション変数が渡せず)

このQ&Aのポイント
  • ローカル環境で動作するプログラムが、レンタルサーバー上では動作しない問題が発生しています。具体的には、セッション変数が正しく渡されず、ページ遷移ができないエラーが発生します。問題の解決策を探すために、設定項目を見直す必要があります。
  • 質問文章のコードは、テキストフォームに入力された値をPOSTしてセッション変数として保存し、ページ遷移するというものです。しかし、レンタルサーバー上では正常に動作せず、ヘッダ情報の送信エラーが発生します。
  • セッション変数が正しく渡されずにエラーが発生する原因として、レンタルサーバーの環境設定やPHPのバージョンの違いが考えられます。具体的な解決策を見つけるために、設定項目を再確認してください。
回答を見る
  • ベストアンサー

ローカル環境で動くのに本番環境で動かない(セッション変数が渡せず)

以下は、 (1) テキストフォームに記入された値をPOSTすると (2) 文字列はSESSION変数としてセットされてpage2に遷移し (3) page2 に書き出される というものですが、 ローカルのWInXP(SP3)+IIS+PHP5.2.6では動作するプログラムが 今般レンタルしたサーバー上で(FreeBSD+Apache1.3.37+PHP5.2.2) では動作しません。 具体的には、page2.phpに遷移できずに Warning: Cannot modify header information - headers already sent by (output started at /usr/home/myaccountname/public_html/page1.php:7) in /usr/home/myaccountname/public_html/page1.php on line 14 となります。 ちなみに、page1.phpの<?php $_SERVER["PHP_SELF"] ?>を page1.phpに書き換えても改善ありませんでした。 ローカルで動いていたものがそのまま動作するとも思っていませんが、 見直すべき設定項目として、何がありますでしょうか? ---------------------------page1.php <?php session_cache_limiter('none'); session_start(); ?> <html> <body> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <input type="text" name="email"> <input type="submit" name="reg"> </form> <?php if ($_POST['email'] != "") { $_SESSION["email"] = $_POST["email"]; header("Location: page2.php"); } ?> </body> </html> ---------------------------page2.php <?php session_cache_limiter('none'); session_start(); ?> <html><body> <?php echo $_SESSION["email"]; ?> </body></html>

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

page1.phpに問題があります。 header関数はあらゆる出力の前にコールされる必要があることになっています。 http://jp2.php.net/header 従って、header関数を使うなら以下のような感じに書き直すべきでしょう。 <?php session_cache_limiter('none'); session_start(); if (isset($_POST['email'])) { $_SESSION["email"] = $_POST["email"]; header("Location: page2.php"); } ?> <html> (省略) </html> 余談ですが、遷移先は絶対URIで記述しないと受け付けないクライアントもあった気がします。

litton101
質問者

お礼

UmJammerさん、早速のご回答ありがとうございました。 ご教示の内容を読んで凍り付いてしまったのですが、 なまじっか、Win(IIS)上で、ちゃんと動いていたことに過信し、 既に、ほとんどのプログラムが完成してしまっている状況です。 さあ、本番環境(レンタルサーバー)でテストしようかという矢先の トラブルで、途方に暮れています。困りました、、、 ともかく、対策を考えて見ます。ありがとうございました。

その他の回答 (1)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

ANo.1です。 なるほど、同様の記述がたくさんあるということですね。 良い方法かわかりませんが、output_bufferingを有効にするという対策もあるかと思います。

litton101
質問者

お礼

UmJammerさん、たびたびのアドバイスありがとうございました。 わたしもちょうど、output_bufferingを有効にするという対策にたどり着いていたところです。 http://go4it.seesaa.net/article/73726670.html (そういえば、過去にIISで開発時も、この設定をOnにしたような記憶もあるような気がします。) 一応、Onで動作は確認できました。首吊りそうでした(^^;ありがとうございました。

関連するQ&A

  • セッションを使わずに遷移先画面に変数の値を渡すには?

    <input type="hidden" value="myID">みたいな隠しフォームで 行く先々の画面に値をPOSTで渡してきました。 他方、 header("Location: mypage.php") のように画面を遷移させる場合、遷移先の画面に $_POST["myID"]のように値を渡すことはできませんか? この場合session_start();を使って、$_SESSION["myID"]のように値を 渡す(保持する)のが王道なのでしょうか? セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 できれば使いたくないのです。 具体的に説明しますと、前にこの掲示板で教えていただいた、次の例を使っています。 入力文字チェックをかけたいのでPHP_SELFで同じ画面を呼び出して、 問題なければmypage.phpにリダイレクトさせる枠組みですが、 header("Location: mypage.php");という風に遷移した場合は、 遷移先のmypage.phpでは、$_POST["myID"]はPOSTされてきませんよね (値を受け取れませんよね)?? 妙案あればご教示下さい。 <?php if ($_POST["reg"] == "" ) $errFlg = true; if (!$errFlg) {     if (strlen($_POST["myName"]) > 30) {       $errFlg = true;       $errStr["myName"] = "30字以下";     }   $errMsg = "エラー!!"; } if ($errFlg) { ?> <html>   <body>     <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">       氏名 <input type="text" name="myName" value="<?= $_POST["myName"] ?>"><?= $errStr["myName"] ?>       <input type="hidden" name="myID" value="<?= $_POST["myID"] ?>">     </form>     <input type="submit" name="reg" value="登録">   </body> </html> <?php } else {     $sql = "update mytable set myID = 'xxxx'";     $rst = mysql_query($sql, $con);     header("Location: mypage.php"); } ?>

    • ベストアンサー
    • PHP
  • header(Location: next.php) だとPOSTした値が渡らない?

    文末は(だいぶ端折ってますが), (1) エラーがあればエラー表示, (2) エラーがなければnext.phpに飛ぶ という動作をするのですが, next.php 内に echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても valueの中身が渡ってきていません. header("Location: next.php"); で飛ばすとだめなのでしょうか. http://oshiete1.goo.ne.jp/qa2706500.html でも,#2さんのアドバイスのようにしようとしましたが, #1さんのご教示のように,セッションを利用するしかないですか? ちょっとセッションで値の渡し方がチンプンカンプンなのですが・・・ <?php session_cache_limiter('none'); session_start(); header("Cache-control:no-cache"); header("Pragma:no-cache"); $errFlg=false; if ( $_POST["reg"] == "" ) $errFlg = true; if ( !$errFlg ) { if ( $_POST["Name"] == "" ) { $errFlg = true; $errStr["Name"] = "未入力"; } } if ( $errFlg ) { ?> <html><body> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <?= $errStr["Name"] ?></td> <input type="text" name="Name" value="<?php echo $_POST["Name"]; ?>"> <input type="submit" name="reg" value="登録"></td> </form> </body></html> <?php } else { header("Location: next.php"); } ?>

    • ベストアンサー
    • PHP
  • IFRAME内PHPのセッション変数取得が出来ない

    既存のHTMLサイトに一部機能追加したいだけ+ブラウザに表示されるURLの関係で、必要部分だけIFRAMEでPHPサーバーのファイルを呼び出して表示させようと考えました。 IFRAMEを記述するHTMLファイル設置サーバーはPHPが使用出来ません。 <iframe src="http://hogehoge/login.php"></iframe> とHTML内にログイン用PHPを表示させ、ボタン押下でログイン判定 →データをセッション変数にセット →header("Location: http://hogehoge/form.php");で画面遷移 →フォーム用PHPに先ほどセットしたセッションデータ表示 とこんな感じの処理がしたいのですが、これがFireFoxだとうまく動くのに、IEだと動いたり動かなかったりします。(動く=開発環境である私のPC、動かない=他全て) ボタン押下で自分自身にPOSTしたデータは正しく受け取って画面遷移まで処理しているのですが、遷移後のページでセッション取得しようとすると取得出来ないようなのです。 IFRAMEを通さず直接URL叩いた場合は、FF・IEどちらも正常に動いています。 session_name('hoge'); session_start(); はPHP先頭に記載してあります。 IFRAMEを使用して外部サーバーのPHPを使用する際に、気をつけねばならない事などがあるのでしょうか… もし解決方法に思い当たる方がいらっしゃいましたら、どうかご回答宜しくお願いいたします。 またもし補足等必要でしたらご指摘下さい。

    • ベストアンサー
    • PHP
  • sessionがクリアされない

    教えてください。 BBB.phpでこのように書いていたとします。 <?php session_cache_limiter('private, must-revalidate'); session_start(); ~いろいろ処理~ unset($_SESSION['pcode']); ~いろいろ処理~ ?> <?php include(dirname(__FILE__).'/../include/header.php'); ?> </body></html> header.phpでは $_SESSION['pcode']を表示しているのですが、 前のページ(たとえばAAA.php)で$_SESSION['pcode']に値を入れていた場合 BBB.phpを表示すると その値が表示されてしまいます。 直前に unset($_SESSION['pcode']); をしているのに その前の値が表示されます。 includeはどのタイミングでなされるのでしょうか? また、 unset($_SESSION['pcode']); を有効にするにはどうすればいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • セッションの破棄

    セッションについて質問です。 $_SESSION['username']を複数ページで使用した後、破棄しようと思うのですが、エラーが出てしまいます。 セッション自体は破棄できていると思うのですが、これはどういったエラーなのでしょうか? ソースコード <?php session_start(); ?> <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>セッション破棄</title> </head> <body> <?php //セッション変数を全て解除 $_SESSION = array(); //セッションクッキーの削除 if (isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } //セッションを破棄する session_destroy(); if(empty($_SESSION['username'])){ echo "<p>セッション終了</p>"; echo "<a href='session.php'>はじめのページへ</a>"; echo "<a href='index.php'>top</a>"; } ?> </body> </html> エラーメッセージ Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php:1) in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 2 Warning: Cannot modify header information - headers already sent by (output started at /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php:1) in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 16 Warning: session_destroy(): Trying to destroy uninitialized session in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 20

    • ベストアンサー
    • PHP
  • キャッシュ無効の状態で、セッション変数への影響は?

    こんにちわ。いつもお世話になってます。 現在会員制のホームページをPHPで制作中です。 IDやPASS等の情報をDB(MySQL)に格納し、ログイン時にDBにアクセスして、照合が出来たら会員である情報をセッション変数に保存して会員用ページを渡り歩く、といったものをイメージしています。 ですが、一つ困ったことが。 会員用コンテンツの中に、掲示板のようなものがあるのですが、投稿した直後に限り、自分の書き込みが反映されてないように表示されるのです。 (form actionは$_SERVER['PHP_SELF']を指定。同じページ内の上部の方で$_POSTを受け取って処理。処理した後はそのまま記事表示処理に移行。) 多分、キャッシュされているからこの様な動作になると思うのですが・・・。 投稿した後に、サイドに用意されているメニューバーから同じページにアクセスすると投稿が反映されて表示されます。 そこで、キャッシュさせない様に、PHPファイルの最上部で header("Content-Type: text/html; charset=Shift_JIS"); header("Expires: Thu, 01 Dec 1994 16:00:00 GMT"); header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); header("Cache-Control: no-cache,must-revalidate"); header("Cache-Control: post-check=0,pre-check=0",false); header("Pragma: no-cache"); を加え、キャッシュさせないように?しました。 実行してみたところ、投稿した直後でも無事に最新の状態を表示してくれるようになりました。 ここで本題です(冗長でゴメンナサイ・・・) 上記のコードでキャッシュを無効にした状態にしても、セッション変数は無事に動作してくれるのでしょうか? ローカルテストではセッション変数は無事に保持してくれるのですが、キャッシュやセッションに関して造詣が浅く、「キャッシュは無効にしてるけどセッション変数はキャッシュする」という矛盾した動作を指定している事に不安を感じます。 ルール上問題があるところがあれば指摘お願いいたします。 php.iniは以下の様に指定しています。 session.cache_limiter private_no_expire session.cache_expire 9999 session.auto_start off

    • 締切済み
    • PHP
  • セッションについて教えてください。

    PHPを独学で勉強中の初心者です。(HTMLとCSSくらいしか分からない所からのスタートです) ログインフォーム→パスワード処理→コンテンツ表示というながれで作っています。 質問は、セッションの有効期限はデフォルトではブラウザを閉じるまでと聞いたのですが、それはウインドウを閉じるではなく、アプリケーションを終了するまでということでよいのでしょうか?ウインドウを閉じただけだと、コンテンツを表示できてしまいます。 また、コードがこんなんでよいものかアドバイスよろしくお願い致します。 --パスワード処理-- <?php session_start(); $id =p; $password =11; $n_id = $_POST["n_id"]; $n_password = $_POST["n_password"]; if(($n_id == $id ) && ($n_password == $password)){ $_SESSION['pass'] = 1; header("Location: page1.php"); }else{echo "IDまたはパスワードが違います。"; } ?> ----コンテンツページ----- <?php session_start(); if(isset($_SESSION["pass"]) && $_SESSION["pass"] == 1){ echo "コンテンツ"; echo "<html><head> <meta http-equiv=Content-type content=text/html; charset=EUC-JP> </head><body>"; echo "<form action =logout.php method=post>"; echo "<input type=submit name=sbm value=ログアウト>"; echo "</form></body></html>"; }else{ header("Location:login1.php"); } ?>

    • 締切済み
    • PHP
  • 古いセッションが消えない

    フォームからのデータを受け取るPHP、sesssion.phpが下記のとおりだとします。 <? header('Cache-Control: nostore, no-cache, must-revvalidate'); session_cache_limiter('private_no_expire'); session_start(); header("Content-Type: text/html; charset=EUC"); $http = $_SERVER['HTTP_REFERER']; //どこから来たか $form_id = $_POST['form_id']; $form_pass = $_POST['form_pass']; $flg = $_POST['t']; $session = session_id(); if($http == "http://192.168.1.250/~fukazawa/session/form.html"){ $_SESSION['id'] = $form_id; $_SESSION['pass'] = $form_pass; } $test = $_SESSION['id']; $test1 = $_SESSION['pass']; if($flg == "t"){ echo <<<EOM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title> </title> </head> <body> ◎$test<br />$test1 <br><br><br><a href="session.php">test</a><br><br> <a href="session.php?t=test">test2</a> </body> </html> EOM; }else{ echo <<<EOM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title> </title> </head> <body> ◎$test<br />$test1 <a href="session.php">test</a><br> <a href="session.php?t=test">test2</a> </body> </html> EOM; } ?> 引数で表示させる内容を異なるようにするPHPファイルです。 仮に一回目にIDを「てすと」、パスワードを「ttt」でログインした場合、session.php・session.php?t=testに表示されるのは、 「◎てすと ttt」 です。 そして、これをいったんログアウトして、今度は ID「二回目」、パスワード「two」でログインすると、 session.phpには 「◎二回目 two 」と表示されますが、 session.php?t=test に飛んだ場合、 一回目のIDとパスワード、つまり 「◎てすと ttt」 が表示されてしまいます。 ブラウザをリロードすると 「◎二回目 two 」 と表示されます。 これは、前のセッションがまだ残ってしまっているということなのでしょうか。 対処法が分からず困っています。

    • ベストアンサー
    • PHP
  • セッション変数に対するエラー表示

    こんにちは。いつもお世話になっています shingetsuです。 PHPをただいま勉強中で、わからないことがあったので質問させていただきます。よろしくお願いします。 現在自分でサイトを作っているのですが、ユーザー登録フォームに空欄があった場合空欄があります、というようなエラーを表示させたいのですが、その表示方法がよくわかりません。 <?php //入力されたデータを読み取る $_SESSION['name'] = $_POST['name']; $_SESSION['passwd'] = $_POST['passwd']; $_SESSION['address'] = $_POST['address']; $_SESSION['tel'] = $_POST['tel']; $_SESSION['email'] = $_POST['email']; このように読み取ってから、ここでif文を使ってエラーを表示させればいいのでしょうか?それとももっと簡単な方法がありますでしょうか?PHPの本を読んでみましたが載ってなく、ネット検索してみようにも検索方法がよくわからないのでヒントやアドバイスをよろしければ教えてください。お願いします

    • ベストアンサー
    • PHP
  • docomoのセッションが切れてしまうのは?

    携帯サイト用のセッションでdocomoの時だけ思うように フォームによるページ遷移ができません。 色々試してみたのですが、サッパリです。 どなたかお知恵をお貸し下さい。 例) -- page01.php -- session_name( "test" ); session_start(); session_regenerate_id(true); $test = session_name()."=".session_id(); if ( ( $smp01 = auth() ) == FALSE ) { header( "Location: ./test.php?redirect=index_test.php?" ); exit; }←ログイン時の処理(ユーザー定義関数にて) ・        ・        ・        ・ <form action="page02.php?<?= $test ?>" method="get" /> 入力:<input name="test01" type="text" value="" /> <input name="smp02" type="submit" value="next" > </form> ↑入力させてpage02.phpにて処理 上記のようにしているのですが、 submitするとログイン時の処理に掛かってセッションが切れてしまい ログインページに戻ってしまいます。 ログイン時の処理を削除するとpage02.phpへと遷移します。 ログイン時の処理を残したままセッションが切れずにフォームによる ページ遷移ができるようにするにはどのようにすれば良いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう