[PHP-users 855] PHP4 で Cookie の処理について

Kenji Tagami php-users@php.gr.jp
Tue, 24 Jul 2001 15:44:46 +0900


 お世話になります。田上と申します。

 環境:
 FreeBSD4.3R
 Apache1.3.20
 php-4.0.6
 IE5.01SP2

 php を使用してまずは入門的に掲示板でも作ろうかと先日から試
行錯誤をしています。
 その中で Cookie の処理を行う際にどうしても意図した通りに動
いてくれないので、相談をさせてください。

 全て記載すると長くなるので、端折っていますが、Cookie の記
録と取り出して HTML に埋め込む処理を以下のようにしています。
 そして書き込み操作(case 'reg')を実行したところ、ブラウザ側
には Cookie が正常に記録しているにもかかわらず、case 'reg' 
内の Htmlshow() では Cookie を取り出せないでいます。
 一度、リロードをしてあげるか、もう一度書き込み操作(case
'reg')をしてあげると正常に Cookie を取り出せて表示できます。
 このように初回の書き込み直後のみ正常に Cookie が取り出せな
い現象の原因が分かる方がいましたら助言をお願いします。

 この Cokkie の記録/読み出し処理を出来る限り汎用化?したい
と思っていますので、意図的に function を使用しています。

 自分でも色々と検証してみたのですが、書き込み直後では 
Get_cookie() で Cookie 情報を読み込めて無いと解っては来てい
るのですが、それがタイミングによるモノなのか、どうなのか判断
をしかねている状態です。

<?php

$cookid   = 'cookid_test';
$cookday  = 30;

switch($mode):
	case 'reg':
		if ($ifrm_cookie == 'on') { Set_cookie(); }
		Get_cookie();
		Htmlshow();
		break;
	default:
		Get_cookie();
		Htmlshow();
		break;
endswitch;

function Htmlshow () {
	global $cook_name, $cook_addr, $cook_url, $ifrm_name, $ifrm_addr, $ifrm_url;

	// Cookie 変換
	Get_cookie();
	if ($cook_name != '') {
		$ifrm_name = $cook_name;
		$ifrm_addr = $cook_addr;
		$ifrm_url = $cook_url;
		$cook_check = ' CHECKED';
	}
	if ($ifrm_url == '') { $ifrm_url = 'http://'; }

$dat .= '
<HEAD>
	<TITLE>掲示板</TITLE>
	<BASE TARGET="_self">
</HEAD>
<BODY>
<FORM METHOD="post" ACTION="./abbs.php">
<INPUT TYPE="hidden" NAME="mode" VALUE="reg">

<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1" WIDTH="550" BGCOLOR="#6495ED"><TR><TD>
<TABLE BORDER="0" CELLSPACING="2" CELLPADDING="0" WIDTH="100%" BGCOLOR="#FFFFFF"><TR><TD>
	<TABLE BORDER="0" WIDTH="100%">
	<TR><TD WIDTH="50%" ALIGN="left"><INPUT TYPE="checkbox" NAME="ifrm_cookie" VALUE="on"' . $cook_check . '>個人情報登録</TD>
	<TD WIDTH="50%" ALIGN="right">NAME : <INPUT TYPE="text" NAME="ifrm_name" SIZE="32" MAXLENGTH="32" VALUE="' . $ifrm_name . '" CLASS="abbsfrm"></TD></TR>
	<TR><TD ALIGN="right" COLSPAN="2">E-MAIL : <INPUT TYPE="text" NAME="ifrm_addr" SIZE="32" VALUE="' . $ifrm_addr . '" CLASS="abbsfrm"></TD></TR>
	<TR><TD ALIGN="right" COLSPAN="2">U R L : <INPUT TYPE="text" NAME="ifrm_url" SIZE="32" VALUE="' . $ifrm_url . '" CLASS="abbsfrm"></TD></TR>
	<TR><TD ALIGN="right" COLSPAN="2">SUBJECT : <INPUT TYPE="text" NAME="ifrm_subj" SIZE="32" CLASS="abbsfrm"></TD></TR>
	<TR><TD ALIGN="center" COLSPAN="2">
	パラグラフ以外の改行は必要ありません。<BR>
	<TEXTAREA NAME="ifrm_note" ROWS="5" COLS="64" WRAP="SOFT" CLASS="abbsfrm"></TEXTAREA><BR>
	タグは全て無効です(クリッカブルURL対応)<BR>
	</TD></TR>
	<TR><TD WIDTH="50%" ALIGN="center"><INPUT TYPE="submit" VALUE="入稿/更新" CLASS="abbsbtn">
	<TD WIDTH="50%" ALIGN="center"><INPUT TYPE="reset" VALUE="校正" CLASS="abbsbtn"><TD></TR>
	</TABLE>
</TD></TR></TABLE>
</TD></TR></TABLE>
</FORM>

</BODY>
</HTML>
';
echo $dat;
echo $cook_name . $cook_addr . $cook_url;
}

function Set_cookie() {
	global $cookid, $cookday, $ifrm_name, $ifrm_addr, $ifrm_url;

	$cookvalue = implode(',', array($ifrm_name, $ifrm_addr, $ifrm_url));
	setcookie("$cookid", $cookvalue,time()+$cookday*24*3600);
}

function Get_cookie() {
	global $cookid, ${$cookid}, $cook_name, $cook_addr, $cook_url;

	list($cook_name, $cook_addr, $cook_url) = explode(',', ${$cookid});
}

?>

--
Kenji Tagami ( akatsuki@m78.com )