スレッド表示 | フラット表示〕 全トピック 920 件中 60 番目 次≫ ≪前

セッションが消えてしまいます。

created: 2008-02-06 00:20 | modified: 2008-02-07 11:06 | reply: 12

[4103] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 00:20
はじめまして。

sessionと戦いはじめて5日ですが、
ラチが開かず困ってしまいこちらにお伺いしました。

困っていることは、
sessionを使ってメールフォームを作成しているのですが、
sessionからうまく値を取り出せません。
(xamppをつかったローカルではうまくできましたが、
サーバにあげると値が消えてしまいます。)

たとえば、入力フォームでわざとエラー値をいれ
入力フォームに返ってくるようにしているのですが、
なぜかsessionに格納した値が取り出せません。
また、確認フォームから入力フォームに帰ってきても
sessionから値を取り出せませんでした。

ソースをレスとして書かせていただきます。
(とりあえずphpinfoも書かせていただきます。)

なにとぞよろしくお願いいたします。
reply: 4104 返信 編集 削除

[4104] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 00:21
///////入力フォーム(input.php)//////
<?php
phpinfo();
session_start();

$name = "";
$mail = "";
$content = "";
$message = "";
$err = array();

if(isset($_SESSION['name'])){
$name = $_SESSION['name'];
}
if(isset($_SESSION['mail'])){
$mail = $_SESSION['mail'];
}
if(isset($_SESSION['content'])){
$content = $_SESSION['content'];
}
if(isset($_SESSION['err'])){
$err = $_SESSION['err'];
unset($_SESSION['err']);
}

if(count($err) == 0){
$message = "入力フォームです。";
}else{
for($i=0; $i<count($err); $i++){
$message .= $err[$i]."<br />";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
</head>
<body>
<?= $message ?>
<form action="mailForm.php" method="post">
<table cellpadding="0" cellspacing="0" border="1">
<tr>
<th>お名前:</th>
<td>
<span class="attentionFont">※半角カナは使用しないでください。</span><br />
<input name="name" type="text" size="20" maxlength="40" value="<?= $name ?>" />
</td>
</tr>
<tr>
<th>メールアドレス:</th>
<td><input name="mail" type="text" size="40" maxlength="100" value="<?= $mail ?>" /></td>
</tr>
<tr>
<th>お問い合わせ内容:</th>
<td>
※半角カナは使用しないでください。<br />
※1000字以内で入力してください。<br />
<textarea name="content" cols="48" rows="10"><?= $content ?></textarea>
</td>
</tr>
</table>
<input type="submit" value="確認画面へ" />
</form>
</body>
</html>
Parent: 4103  reply: 4105 返信 編集 削除

[4105] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 00:21
///////チェックフォーム(mailForm.php)/////
<?php
// セッションスタート
session_start();

$name = $_POST['name'];
$mail = $_POST['mail'];
$content = $_POST['content'];

// POSTされてきた値を加工
$name = dataProcess($name);
$mail = dataProcess($mail);
$content = dataProcess($content);

// エラー変数初期化
$err = array();

// 値が入力されているかチェック
if(count($err) == 0){
if($name == ""){
array_push($err, "名前が入力されておりません。");
}
if($mail == ""){
array_push($err, "メールアドレスが入力されておりません。");
}
if($content == ""){
array_push($err, "お問い合わせ内容が入力されておりません。");
}
}

// 入力値が不正でないかをチェック
if(count($err) == 0){
$cp = "^[_a-z0-9\-]+(\.[_a-z0-9\-]+)*@[a-z0-9\-]+(\.[_a-z0-9\-]+)*$";
if(!ereg($cp, $mail)){
array_push($err, "正しいメールアドレス形式で入力してください。");
}
if(mb_strlen($content, "SJIS") > 1000){
array_push($err, "1000文字以内で入力してください。");
}
}

$_SESSION['name'] = $name;
$_SESSION['mail'] = $mail;
$_SESSION['content'] = $content;

/*
エラー数により
確認画面(confirm.php)、
修正画面(input.php)のどちらかを読み込む
*/
if(count($err) == 0){
include("confirm.php");
}else{
$_SESSION['err'] = $err;
include("input.php");
}

// POST値を加工する関数
function dataProcess($data){
// 半角カナを全角カナに変換
$data = mb_convert_kana($data, "KV", "EUC-JP");
// 入力値をエンコード(EUC-jP → SJIS)
$data = mb_convert_encoding($data, "SJIS", "EUC-JP");
// 特殊文字をHTMLエンティティに変換
$data = htmlspecialchars($data, ENT_QUOTES, "SJIS");
return $data;
}
?>
Parent: 4104  reply: 4106 返信 編集 削除

[4106] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 00:22
///////確認フォーム(confirm.php)///////
<?php
session_start();

$name = $_SESSION['name'];
$mail = $_SESSION['mail'];
$content = $_SESSION['content'];

$showContent = nl2br($content);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>お客様サポート</title>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
</head>

<body>
以下の内容で送信しますか?

<table cellpadding="0" cellspacing="0" border="1">
<tr>
<th>お名前:</th>
<td><?= $name ?></td>
</tr>
<tr>
<th>メールアドレス:</th>
<td><?= $mail ?></td>
</tr>
<tr>
<th>お問い合わせ内容:</th>
<td><?= $showContent ?></td>
</tr>
</table>
<form class="submitLeft" action="sendMail.php" method="post">
<input type="submit" value="送信する" />
</form>
<form class="submitRight" action="input.php" method="post">
<input type="submit" value="修正する" />
</form>
</body>
</html>

*** phpinfo ***
Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /tmp
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid On On
Parent: 4105  reply: 4107 返信 編集 削除

[4107] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 00:24
検証用コードを書こうと思っていたのですが、
時間がなくてここまでしか縮小できませんでした。

BBSを汚してしまいすみません;
Parent: 4106  reply: 4108 返信 編集 削除

[4108] Re. セッションが消えてしまいます

user: ゆうじ | created: 2008-02-06 02:55
こんばんわ。
がんばっていっぱい書きましたね。

///////入力フォーム(input.php)//////
<?php
phpinfo();
session_start();

ここで、session_start() に失敗してはいないでしょうか。
試しに、phpinfo() を削除するか、
session_start と順番を入れ替えてみてください。


# (マニュアルより引用)
# 注意: クッキーに基づくセッションを使用している場合、
# ブラウザに何か出力を行う前に session_start() を
# コールする必要があります。
http://jp.php.net/manual/ja/function.session-start.php

session_start は暗黙のうちにヘッダを出力するので、
これよりも前にブラウザに向けて何か出力してると
session_start が失敗します。
ここでは、phpinfo の結果を session_start よりも先に出力していますね。

ローカルマシンとサーバーの違いは、
output_buffering か output_handler あたりではないでしょうか。
http://jp.php.net/manual/ja/ref.outcontrol.php#ini.output-buffering

デフォルトではスクリプトの実行順序のまま
ブラウザに出力されるので、ヘッダがらみの出力順には配慮が要ります。

XAMPP はこれに何か設定してると思います。
すぐにはブラウザに向けて出力されず
サーバー溜め込まれてる状態なので、
session_start してもOKだったのではないでしょうか。
Parent: 4107  reply: 4109 返信 編集 削除

[4109] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 17:24
返信ありがとうございます。
(メールの件ありがとうございました。ご迷惑をおかけしました。)

session_start()の前にphpinfo()があるのですが、すみません。
ここに来る前に書いて、そのまま投稿してしまいました。

セッションの値が消えてしまう現象は、
phpinfo()がなくても起きてしまいます。

あと、output_bufferingとoutput_handlerあたりと
アドバイスをいただいたので、ローカルとサーバの
phpinfo()の該当項目を見てみたのですが、
ともに同じ値になっておりました。

処理の流れがおかしいのでしょうか?

よろしくお願いいたします。
Parent: 4108  reply: 4110 返信 編集 削除

[4110] Re.セッションが消えてしまいます。

user: ゆうじ | created: 2008-02-06 18:38
メールの件、私も気づかなくて対応が遅くなりすみませんでした。


さて、さっとコードを見ただけでは問題箇所はわかりませんね。
var_dump($_SESSION['name']) で、
どこまで値が保持されてるか確認はしてみましたか。


それよりもこの処理が気になるのですが、
if(count($err) == 0){
include("confirm.php");
} else {
$_SESSION['err'] = $err;
include("input.php");
}

同じ処理の流れの中で $_SESSION を参照したり、
初期化したりしている間は、メモリー上のやり取りだけで
値はまだセッションファイル保存されていません。
実際 $_SESSION の値が ファイルに保存されるのは
スクリプトの終了時だったと思います。

ここで、include("input.php"); としてるので
再び session_start が呼ばれて、$_SESSION を
初期化してるのではないでしょうか。
また、セッションは暗黙のうちに
クッキーを送受信してるので、ここに
ページ移管が無いことが原因かもしれませんね。


include の前に session_write_close で
強制的に書き込むといいのかも・・・
http://jp.php.net/manual/ja/function.session-write-close.php

でもフォームの処理ではリロード対策も必要になるので
session_write_close も include もやめて
ぞれのページにリダイレクトするのがベターだと思います。
header('Location: '.$url);
http://jp.php.net/manual/ja/function.header.php

# でもこれでいけたりすると
# XAMPP でいけてる理由がわかんないですね。
Parent: 4109  reply: 4111 返信 編集 削除

[4111] セッションが消えてしまいます。

user: あかぴよ | created: 2008-02-06 19:54
> メールの件、私も気づかなくて対応が遅くなりすみませんでした。

いえいえ、こちらの不注意でしたのでお気になさらずに。

> header('Location: '.$url);
> http://jp.php.net/manual/ja/function.header.php

こちらを参考に、include()をやめheader()で試してみましたが、だめでした。
SIDや絶対URLなど試してみましたが、だめでした。

> var_dump($_SESSION['name']) で、
> どこまで値が保持されてるか確認はしてみましたか。

デバックするのを忘れておりました;;
input.phpのsession_start()の下に入れてみて実験してみました。
結果、header()でinput.phpに戻った時点で空になっておりました。


サーバの設定に問題があるのでしょうか?
Parent: 4110  reply: 4112 返信 編集 削除

[4112] 簡単な切り分けスクリプト

user: ゆうじ | created: 2008-02-06 23:15
こんな時は問題点を切り分けるのに
簡単なスクリプトを実行してみましょう。

以下はリロードの度にカウントアップするスクリプトですが
これが動けば、session の動作に問題なし、スクリプトの問題。
これが動かなければ、スクリプト以前の
設定や環境の問題といった具合に切り分けできます。

<?php
session_start();
if (isset($_SESSION['count'])) {
$_SESSION['count']++;
} else {
$_SESSION['count'] = 0;
}
echo $_SESSION['count'];
?>
Parent: 4111  reply: 4113 返信 編集 削除

[4113] スクリプトの結果です

user: あかぴよ | created: 2008-02-07 00:06
問題の切り分けですか。
なるほど、たしかに問題の切り口になりますね。

わざわざスクリプトまで用意していただいて
ありがとうございます。

スクリプトをサーバにあげて実行してみましたところ、
正常に動いておりました。
ということは、わたしのスクリプトが問題ですね;;

session_start()とheader()のあたりが怪しいと思い、
ソースをいろいろいじっているのですが、
…うーん;
Parent: 4112  reply: 4114 返信 編集 削除

[4114] register_globals

user: ゆうじ | created: 2008-02-07 02:03
現象が飲み込めなかったので
以下のように修正を加えやってみたところ
原因らしきものにぶち当たりました。

mailForm.php
if(count($err) == 0){
// include 'confirm.php';
header("Location: http://localhost/confirm.php");
exit();
}else{
$_SESSION['err'] = $err;
// include 'input.php';
header("Location: http://localhost/input.php");
exit();
}

input.php
<?php
session_start();

var_dump($_SESSION); // (1)

$name = "";
$mail = "";
$content = "";
$message = "";
$err = array();

var_dump($_SESSION); // (2)


以下は input.php の var_dump の結果で、
初めは $_SESSION に値があるので
セッション変数が引き継がれてるのがわかります。
ただグローバル変数の初期化後これが消えてるのが変です。

もうひとつおかしい所は、
$_SESSION の各値が参照になってるところです。
普通 &string(3) "aaa" の「&」はつきません。

var_dump // (1)
array(4) {
["name"]=>
&string(3) "aaa"
["mail"]=>
&string(3) "sss"
["content"]=>
&string(4) "dddd"
["err"]=>
&array(1) {
[0]=>
string(44) "正しいメールアドレス形式で入力してください。"
}
}

var_dump // (2)
array(4) {
["name"]=>
&string(0) ""
["mail"]=>
&string(0) ""
["content"]=>
&string(0) ""
["err"]=>
&array(0) {
}
}

試しに $name = ""; のところを $name = "a"; とすると
var_dump // (2) の結果も ["name"]=>&string(0) "a" に変わります。
$_SESSION['name'] == $name が成り立ってるようです。

もしやと思い register_globals = On だったののを
Off に変えたら参照だったセッション変数が実態に変わり
コロリと目的の動作をするようになりました。

register_globals = On だったので
セッション変数がグローバル変数に展開されてたって事でしょうね。
これは、はまります。

サーバーとローカルマシンの違いはこれでないでしょうか。
Parent: 4113  reply: 4116 返信 編集 削除

[4116] ありがとうございます!!

user: あかぴよ | created: 2008-02-07 11:06
まさにご指摘のとおり、「register_globals」が原因でした!

サーバのphpinfoを見てみたところ、
「register_globals = On」になっており、
逆にローカルでは、
「register_globals = Off」になっておりました。

調べてみましたところ、
PHP 4.2.0以前はONになっていたのですが、
グローバル変数の汚染が問題になり、それ以降はOffになったとのことです。
(サーバは見事にPHP 4.1でした;;)

実際にサーバのphp.iniを編集し、Offに切り替えたところ、
希望通りの動作になりました。

長い間お時間を取らせてしまい、申し訳ありませんでした。
そして、デバックの大切さを改めて痛感いたしました。

ありがとうございました。
Parent: 4114  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 60 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑