プロが教えるわが家の防犯対策術!

サーバー移転に伴い、PHPのバージョンが4から5に変更になりました。

大部分は、変更することなく動作しているのですが、セッションを利用している部分がうまく動作してくれません。

ソースは全く変更していませんので、PHP4とPHP5の仕様の違い以外に思いつく理由が見当たりません。

具体的に説明しようにも、何が間違っているのかわからない状態です。
ただ一つ、明確な症状としては、$_SESSIONに値が格納されない、あるいは勝手に破棄されてしまう。ということです。

PHP4からPHP5に移行する際、セッション周りで変更すべき点などがあれば教えていただけないでしょうか。
宜しくお願いします。

A 回答 (3件)

PHP4のサーバとPHP5のサーバで、同じソースを元にアレンジしたシステムを何度か入れたことがあります。

セッション周りについては、特にトラぶった記憶はないのですが・・・。どのようにしてセッション関係を利用されているのでしょうか。

セッションへの値のやり取りは$_SESSIONかsession_registerを使っていますか?

session_startを実行してからセッション処理を行っていますか?

ヘッダーが送信される前にセッションの処理を済ませていますか?

サーバの設定などによって、これらをきちんとしていなくとも動いていた可能性はありますが、これらをきちんとして作ってあれば特に大きな問題はなかったように思えます。上記の点について確認してみてはいかがでしょう。

この回答への補足

ご回答ありがとうございます。

まずはご指摘の件について…

> セッションへの値のやり取りは$_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」へ進む。という手順です。

以上、わかりやすく説明するため、直接的な影響がないだろうと思われる部分は割愛しています。
ご不明な点などがありましたらご指摘ください。

補足日時:2007/12/30 13:57
    • good
    • 0

 「基礎PHP」という本でPHPを勉強しました。



 PHP5で勉強したのでPHP4とのちがいは知りませんが、その本の付録CDのサンプルソースではPHP5用とPHP4用がついていました。PHP5でPHP4用のソースでは動作しませんでした。

 PHP5とPHP4の非互換項目一覧などを探す必要があると思います。

 PHP4→PHP5移行ガイド いまこそPHP資産をマイグレーション(ソフトバンククリエイティブ ISBN:978-4-7973-4062-4)という本も出版されているので参考にしてはどうでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/30 13:59

ここは[技術者向]です。


技術者ならまずマニュアルを読みましょう。

OS、マイナーバージョン以下、スクリプト等を隠しているので
外しているかもしれませんが

第 29章グローバル変数の登録機能の使用法
PHP 4.2.0において PHPのディレクティブ register_globalsが
デフォルトでONからOFFに変更されました。
    • good
    • 0
この回答へのお礼

すみません。私は技術者ではありません。
「技術者向けの高いレベルの質問をする場」だと思い、ここに質問させていただきました。

もちろん、マニュアルを見たり、他の情報を探したり、自分なりに試行錯誤したり、その結果解決できなかったため質問させていただきました。

ご提示いただいた内容は、pnp.iniの変更を伴うものだと思いますが、レンタルサーバーのためできないと思います。

お礼日時:2007/12/30 01:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!