• 締切済み

PHP4からPHP5へ移行した際、セッションがおかしい

サーバー移転に伴い、PHPのバージョンが4から5に変更になりました。 大部分は、変更することなく動作しているのですが、セッションを利用している部分がうまく動作してくれません。 ソースは全く変更していませんので、PHP4とPHP5の仕様の違い以外に思いつく理由が見当たりません。 具体的に説明しようにも、何が間違っているのかわからない状態です。 ただ一つ、明確な症状としては、$_SESSIONに値が格納されない、あるいは勝手に破棄されてしまう。ということです。 PHP4からPHP5に移行する際、セッション周りで変更すべき点などがあれば教えていただけないでしょうか。 宜しくお願いします。

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

みんなの回答

noname#49664
noname#49664
回答No.3

PHP4のサーバとPHP5のサーバで、同じソースを元にアレンジしたシステムを何度か入れたことがあります。セッション周りについては、特にトラぶった記憶はないのですが・・・。どのようにしてセッション関係を利用されているのでしょうか。 セッションへの値のやり取りは$_SESSIONかsession_registerを使っていますか? session_startを実行してからセッション処理を行っていますか? ヘッダーが送信される前にセッションの処理を済ませていますか? サーバの設定などによって、これらをきちんとしていなくとも動いていた可能性はありますが、これらをきちんとして作ってあれば特に大きな問題はなかったように思えます。上記の点について確認してみてはいかがでしょう。

ka-kichi
質問者

補足

ご回答ありがとうございます。 まずはご指摘の件について… > セッションへの値のやり取りは$_SESSIONかsession_registerを使っていますか? はい。$_SESSIONを使用しています。 > session_startを実行してからセッション処理を行っていますか? > ヘッダーが送信される前にセッションの処理を済ませていますか? はい。設定ファイルを読み込んだ直後に、下記の要領で処理しています。(index.phpのソース参照) いろいろ調べたところ、変数への「参照渡し」か「コピー」かの違いも疑ったのですが、 $_SESSION[test] = 1; print $_SESSION[test]; とすると、確かに代入されていますし、他のページに移動しても「1」を保持しています。 このことから、セッション自体は正常に動作しているものと思われます。 以下、ソースの概要を説明させていただきます。 ### index.php ### <?php require_once './config.php';($s_nameを定義) session_name($s_name); session_start(); //セッションをチェックする為の表示(運用時は削除) print_r($_SESSION); //ここで<body>まで表示 switch($_GET['no'])) { case 1: require "no1.php"; break; case 2: require "no2.php"; break; default: require "top.php"; } //ここで</body>以下を表示 ?> ### no1.php ### <?php $_SESSION['v1'] = $_POST['v1']; $_SESSION['v2'] = $_POST['v2']; $_SESSION['v3'] = $_POST['v3']; //上記セッションの値を元に、DB(MySQL5)からデータを取得 //取得したデータを表示 print <<<EOF <form method="./?no=1"> <select name="v1" onChange="this.form.submit()"> <option value="1">データ1-1</option> <option value="2">データ1-2</option> <option value="3">データ1-3</option> </select> <select name="v2" onChange="this.form.submit()"> <option value="1">データ2-1</option> <option value="2">データ2-2</option> <option value="3">データ2-3</option> </select> <select name="v3" onChange="this.form.submit()"> <option value="1">データ3-1</option> <option value="2">データ3-2</option> <option value="3">データ3-3</option> </select> <input type="submit" value="送信" /> </form> EOF; ?> 「ttp://・・・/」へアクセスした後、 「ttp://・・・/?no=1」へ進んで、さらに 「ttp://・・・/?no=2」へ進む。という手順です。 以上、わかりやすく説明するため、直接的な影響がないだろうと思われる部分は割愛しています。 ご不明な点などがありましたらご指摘ください。

回答No.2

 「基礎PHP」という本でPHPを勉強しました。  PHP5で勉強したのでPHP4とのちがいは知りませんが、その本の付録CDのサンプルソースではPHP5用とPHP4用がついていました。PHP5でPHP4用のソースでは動作しませんでした。  PHP5とPHP4の非互換項目一覧などを探す必要があると思います。  PHP4→PHP5移行ガイド いまこそPHP資産をマイグレーション(ソフトバンククリエイティブ ISBN:978-4-7973-4062-4)という本も出版されているので参考にしてはどうでしょうか?

ka-kichi
質問者

お礼

非互換機能にも目を通しました。

  • umota
  • ベストアンサー率46% (150/324)
回答No.1

ここは[技術者向]です。 技術者ならまずマニュアルを読みましょう。 OS、マイナーバージョン以下、スクリプト等を隠しているので 外しているかもしれませんが 第 29章グローバル変数の登録機能の使用法 PHP 4.2.0において PHPのディレクティブ register_globalsが デフォルトでONからOFFに変更されました。

ka-kichi
質問者

お礼

すみません。私は技術者ではありません。 「技術者向けの高いレベルの質問をする場」だと思い、ここに質問させていただきました。 もちろん、マニュアルを見たり、他の情報を探したり、自分なりに試行錯誤したり、その結果解決できなかったため質問させていただきました。 ご提示いただいた内容は、pnp.iniの変更を伴うものだと思いますが、レンタルサーバーのためできないと思います。

関連するQ&A

  • PHPのセッションについて

    現在PHPでの開発を行っております。 環境は、PHP4.0.5、サーバはレンタルでFreeBSDです。 セッションに格納する変数について教えていただきたいと思っております。 セッションに変数をセットする際に、session_registerを使用しているのですが、格納される変数の型はどこで指定するのでしょうか。 例えば、今、セッション変数として、$no="001"をsession_register("no")として、格納しているのですが、 session_registerで値を取得しようとすると、「1」が返ってきます。 セッション変数に格納した時点で、どうやら数値に変換されているようなのですが、文字列として格納することはできないのでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • phpのセッションについて

    XAMPPのローカル環境でphpのプログラムを組んだのですが、いざ実際のサーバーにアップロード してもうまく動きませんん。 調べた結果セッションがちゃんと動いていないという結論に達しました。 単純なセッションなのですが、ローカル環境ですとちゃんと動くのが、サーバーにアップすると $_SESSION['sa']が空っぽの状態となります。 サーバーにアップロードしたindex.phpの中にecho $_SESSION['sa'];と書き込むと 「あいうえお」とちゃんと表示されますのでセッションには格納されているようなのですが 値をきちんとセッションで持ち越せないようです・・。 ローカルでは下記のファイルはちゃんと持ち越せていて、実際のサーバーではダメな理由がまったくわかりません。 何か特別な設定が必要なのでしょうか?何時間もググっていますがそういった設定が必要と いう記述は見当たらないのですが・・。 サーバーはさくらサーバーでバージョンはPHP 5.4.22となっています。 ------------------------------------------------------------ ファイル名 index.php <?php session_start(); $data="あいうえお" $_SESSION['sa']=$data; ?> <a href="aaa.php">aaa.phpへのリンク</a> ------------------------------------------------ ファイル名aaa.php ------------------------------------------------ <?php session_start(); $sss = $_SESSION['sa']; echo $sss ; ?> ------------------------------------------------

    • ベストアンサー
    • PHP
  • PHP SESSION 設定について

    PHP(レンタルサーバー:5.3.6)(ローカル:5.3.26)を使用しています。 簡単なログインフォームを作っていました。 ローカルでテスト運用したところ、問題なく動作していたのでレンタルサーバーにアップロードしたところ、SESSIONが動いていない(?継承していない?)ことに気づきました。 そこでphpinfoを確認すると レンタルサーバーは、 session.cookie_httponly=1(On) session.cookie_secure=1(On) になっていました。XSS攻撃に全部ではないけどレンタルサーバーの設定だと有効だということなので、ローカルもレンタルサーバーの設定に合わせたいと思っています。 ※設定をoffにすると問題なく動作します。 sample2.phpで、「$_SESSION['sample_title']」が表示されなくなってしまいました。 どのようにすれば、sessionが正しく動作するかご教授お願いいたします。 抜粋スクリプト ■sample1.php session_start(); session_regenerate_id(TRUE); $_SESSION["sample_title"] = "PHPのSESSION"; //セッション登録 echo "$_SESSION['sample_title']に代入した値は「<?php echo $_SESSION['sample_title'] ?>」です。"; echo "<a href = 'sample2.php'>次のページ</a>"; ■sample2.php session_start(); session_regenerate_id(TRUE); echo "受け取ったセッション変数の値は「".$_SESSION['sample_title'] ."」です。";

    • ベストアンサー
    • PHP
  • 困ってます。phpセッションについて

    phpセッションについて教えてください。 既にwebサーバで動いているシステムがあります。 改修する必要があるため、パソコンの仮想サーバ(XAMPP)で動かした所、セッションに関わる部分がうまくいきません。 ●保存してる箇所 session_start(); session_regenerate_id( TRUE ); $_SESSION['xxx'] = $xxx; ●呼び出している箇所 session_start(); session_regenerate_id( TRUE ); if ( !isset( $_SESSION['xxx']) ) { //←ココでひっかかります //終了するための処理 exit; } $xxx = $_SESSION['xxx']; ************** 設定に関する部分です。 ●「.htaccess」の設定は以下のようにしています。 php_flag session.use_cookies On php_value session.cookie_lifetime 0 php_flag session.use_trans_sid Off php_value session.gc_maxlifetime 3600 php_value session.save_path 'C:temp' 'C:temp'に保存されたデータはありますので、書き出しはうまくいってるようです。 呼び出しがうまくいってません。 ソースの session_start(); session_regenerate_id( TRUE ); の直後に var_dump($_SESSION['xxx']); で値を参照するとNULLです。 ●「php.ini」のセッションの箇所は以下のようになっています。 session.save_handler = files よろしくお願いします。

    • ベストアンサー
    • PHP
  • $_SESSIONの取りだし方、使い方PHP

    質問失礼いたします。 【1.html】から【A.php】に$_POSTされた値を、$_SESSIONにて下記の通りに格納しています。 $name = $_POST['name']; $_SESSION['name'] = $_POST['name']; $address = $_POST['address']; $_SESSION['address'] = $_POST['address']; $gender = $_POST['gender']; $_SESSION['gender'] = $_POST['gender']; そして、上記の$_POSTされた値を使って、データを検索し20件ずつ表示させて改ページを行っています。 <?php if ($page > 1) { ?> <li><a href="search2.php?page=<?php print($page - 1); ?>">前のページへ</a></li> <?php } else { ?> <li>前のページへ</li> <?php } ?> <?php if ($page < $maxPage) { ?> <li><a href="search2.php?page=<?php print($page + 1); ?>">次のページへ</a></li> <?php } else { ?> <li>次のページへ</li> <?php } ?> 違うかもしれませんが、 アドレスに  &name=○&address=○&gender=○  という風にして、次のページではアドレスにある値を使う みたいなこととは思うのですが、   &name=<?php print($name; ?> とすると、アドレスでは  &name=Array となってしまいます。 セッションに格納した検索条件を次のページにも使うようにはどのようにすればよいのでしょうか。 また、上記の次ページのアドレスに、  &name=○&address=○&gender=○  と表示しないようなやり方もあるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのセッションIDについて

    PHP5.3.14を使っています。 セッションについて勉強中です。 セッションを使ってページの表示回数をカウントアップするソースと、 そのセッションを破棄するソースの2種類を用意しました。 ※それぞれ、session_id()をecho表示しています。 クッキーを使った状態でこれらを動かすと、 リセットする(リンクを押してリロードする)度にセッションIDが変わるのですが、 クッキーを使わずに定義済み定数SIDを使って動かすと、 カウント値は元に戻るのですが、 リセットしてもセッションIDが変わりません。 どうすれば、新しいセッションIDを発行(SIDの値を更新)できるのでしょうか? よろしくお願いします。 【以下、ソース2種類と、iniファイルの一部です】 ●up.php <?php session_start(); if (empty($_SESSION['count'])) { $_SESSION['count'] = 1; } else { $_SESSION['count']++; } echo ("###".'"'.session_name().'='.session_id().'"'."</br>"); ?> <p> <?php echo $_SESSION['count']; ?> 回目。 </p> <p><a href="up.php">カウントアップ</A> </p> <p> <a href="reset.php">リセット</A> </p> ●reset.php <?php session_start(); echo ("###".'"'.session_name().'='.session_id().'"'."</br>"); echo ("##### ". $_SESSION['count']."回表示しました。</br>"); $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } if(isset($_REQUEST[session_name()])){ $_REQUEST[session_name()]="" ; } session_destroy(); ?> <p> <a href="up.php">初めからカウントする</A> </p> ●php.ini (クッキーを使わずSIDを使うを設定) session.use_trans_sid = 1 session.use_only_cookies=0 session.use_cookies=0

    • 締切済み
    • PHP
  • phpのセッションについて質問です。

    今、for文を使ってsession変数に値を入れて行く処理を作っております。そのためにセッション配列を使おうと考えておりますが、使い方が分からないので教えてください。一応、自分なりに書いてみたのですが動きませんでした。処理的には、一つ目のfor文で値をsessionの配列に一つずつ入れていき、二つ目のfor文でその格納したのを表示するようにしたいです。 <?php session_start(); for($a=1;$a<10;$a++){ $_SESSION['no'][$a]=$a; } for($b=1;$b<10;$b++){ print("こんにちわ".$SESSION['no'][$b]); } ?> ご回答のほどをよろしくお願いします。

    • ベストアンサー
    • PHP
  • php、cgi(perl)をlinuxに移行

    php、perl初心者です。 現在、windowsサーバーからlinuxサーバーに移行しようとしていますが、 widowsサーバーで動作していたphp、cgiが動作してくれません。 プログラムはDB接続情報以外は全く変更していないのですが、 http 500 内部サーバーエラーがでてしまいます。 ちなみにperl、php、MySQLのバージョンは以下となります。 perl : 5 php : 5.2.17 MySQL : 5.1.45 大変情報が少なく、申し訳ありませんが、 どのあたりに気をつけなければならないのかご教授していただけないでしょうか?

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

    お世話になります。 現在セッションを使用してのPHPプログラムのコーディングに取り組んでおりますが、 なんとなくですがセッションのことはつかめつつあります。 そこで、基本的な質問になるのですが教えてください。 1.セッションは必ず破棄しないといけないのか。 私の想像としては、一定時間(20分くらいだったような…)またはブラウザを閉じたときにセッションが破棄されるものと思っていました。 ですが、ある掲示板で 「セッションが不要になった段階でセッションを破棄してください。  これをしないとサーバ上にセッションデータ(ファイル)がたまっていきます。」 という記述を見つけました。 必ずセッションというものは破棄しないといけないのでしょうか。

    • ベストアンサー
    • PHP
  • ホスト名に"_"を含む場合のSession変数維持

    Windows 2000 Server環境を使用しています。 サーバーのホスト名に"_"を使用しており、ASPにてCookieが使用できないことを知りました。 単純にホスト名を変更すればよいのですが、他のアプリでも使用しており、変更することが難しいのが現状です。 Session変数がダメならとDimで試してみましたが、ページが偏移すると値は破棄されてしまいました。 ホスト名を変更せずにSession変数(またはDim)の値を維持させる方法はありませんでしょうか。 なお、Application変数は通るのですが、ユーザーごとに値が格納できないためNGとなりました。 宜しくお願いいたします。

専門家に質問してみよう