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

IDをフォームに記入してクッキーに保存し、別ページで使用しようとしています。

フォームに入力してsubmit(onclickでCookieに保存)しようとすると、
1回遅れでCookieに保存されます。
(前々回保存した内容がCookieに保存される)

POSTを変数に入れる順番がおかしいのでしょうか?

ご教示お願い致します。

以下ソースです。

setid.php

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">
<!--

// Cookie設定
// Cookie送信function
function setCookie(key,val,url){
tmp = key+"="+escape(val)+";";
tmp += "expires=Fri, 31-Dec-2030 23:59:59;";
if(url){
tmp += "domain="+getDomain(url)+";";
tmp += "path="+getDomainPath(url)+";";
}
document.cookie = tmp;
location.reload(true);
};

// Cookie削除function
function delCookie(key){
expiredate = new Date();
expiredate.setYear(expiredate.getYear()-1);
tmp = key+"=;";
tmp += "expires="+expiredate.toGMTString();
document.cookie = tmp;
};

// Cookie削除(削除ボタン用)
function del_cookie_id(){
delCookie("testid");
location.reload(true);
}

//-->
</script>

</head>

<body>
<center>


<!-- ID入力フォーム -->
<?php
// Cookie読込み-ID
$testid=$_COOKIE["testid"];
?>
<form action="setid.php" method="post">
<input type="text" name="testid" size="20" value="<?php echo $testid; ?>">


<!-- ID保存ボタン -->
<?php
$testid=$_POST["testid"];
?>

<input type="submit" name="set_id" value="IDを保存" onclick="setCookie('testid','<?php echo $testid; ?>');">
<!-- ID削除ボタン -->
<input type="submit" name="del_id" value="IDを削除" onclick="del_cookie_id()">
</form>
<br>


<!-- Cookie表示 -->
<?php
print_r($_COOKIE);
?>
<br>

</body>

</html>

A 回答 (3件)

ソース全部書いててくれてありがとうございます。


とても楽にテストする事ができました。

ちゃんと説明しようかと思ったのですが、書いているうちに自分でわけ分らなくなってきたので、簡単に説明します。

一回目にテキストボックスに[aaa]と入力し[IDを保存]。
二回目に[bbb]と入力し[IDを保存]。

で、三回目に表示された時のHTMLソースが↓これ。

<form action="setid.php" method="post">
<input type="text" name="testid" size="20" value="aaa">
<!-- ID保存ボタン -->
<input type="submit" name="set_id" value="IDを保存" onclick="setCookie('testid','bbb');">
<!-- ID削除ボタン -->
<input type="submit" name="del_id" value="IDを削除" onclick="del_cookie_id()">

結論:POSTしたものを、次のsubmitでcookieに入れてるから。

んで、疑問なのは なぜに JavaScriptを使っているのかなー?と。
setcookie()を使えないという縛りでもあるのかな。と思いつつ。

http://php.net/manual/ja/function.setcookie.php

この回答への補足

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

> んで、疑問なのは なぜに JavaScriptを使っているのかなー?と。
> setcookie()を使えないという縛りでもあるのかな。と思いつつ。

それもそうですね。
シンプルにするために、setcookie()を使ってみました。
さらにCookie発行用のページに分けることでできるようになりました。
ありがとうございます。

しかし、ページが多くなってしまうと管理が面倒くさくなってしまいます。
発行用ページに分けない方法はありますでしょうか?

お忙しいところ申し訳ありませんが、ご教示お願い致します。


以下ソースです。

setid.php

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<center>

<!-- ID入力フォーム -->
<form action="setidset.php" method="post">
<?php $testid=$_COOKIE["testid"]; ?>
<input type="text" name="testid" size="20" value="<?php echo $testid; ?>">
<input type="submit" name="set_id" value="IDを保存">
</form>

<!-- ID削除ボタン -->
<form action="setidreset.php">
<input type="submit" name="del_id" value="IDを削除">
</form>
<br>

<!-- Cookie表示 -->
<?php print_r($_COOKIE); ?>
</body>
</html>


setidset.php

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<?php $testid=$_POST["testid"]; ?>
<?php setcookie('testid',$testid,time()+60*60*24*30*120); ?>
<meta http-equiv="refresh" content="0;URL=setid.php">
</head>
<body>
</body>
</html>


setidreset.php

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<?php setcookie('testid',"",time()-60); ?>
<meta http-equiv="refresh" content="0;URL=setid.php">
</head>
<body>
</body>
</html>

補足日時:2011/10/17 11:10
    • good
    • 0
この回答へのお礼

ありがとうございました。
アドバイスのおかげで、かなりシンプルになりました。

お礼日時:2011/10/18 02:07

setcookieを送出したスクリプト内では、$_COOKIEは従前のままです。



http://php.net/manual/ja/function.setcookie.php

--- 引用ここから ---
一度クッキーが送信されると、次のページのロードからは $_COOKIE や $HTTP_COOKIE_VARS 配列によってクッキーにアクセスできます。
--- 引用ここまで ---
『次のページのロードからは 』というのが肝ですね。ブラウザに対してCookieを保持するように指示はしていますが、(その時点では)まだブラウザからCookieを受け取ってはいませんから。

ひとつのスクリプトで書くとすると、下記のようになると思います。

<?php
if (isset($_POST['set_id'])) {
setcookie('testid', $_POST['testid'], time()+60*60*24*30*120);
$_COOKIE['testid'] = $_POST['testid']; // ブラウザからは取得出来ていないので、$_COOKIEへもセットする必要がある
}
if (isset($_POST['del_id'])) {
setcookie('testid', '', time()+60*60*24*30*120);
$_COOKIE['testid'] = '';
}
// チェック及びsetcookieは一番最初にまとめて書く(headers already sentを避ける)
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<center>
<!-- ID入力フォーム -->
<form action="setid.php" method="post">
<?php
if (isset($_COOKIE['testid'])) {
$testid=$_COOKIE["testid"];
} else {
$testid = '';
}
?>
<input type="text" name="testid" size="20" value="<?php echo $testid; ?>">
<input type="submit" name="set_id" value="IDを保存">
</form>

<!-- ID削除ボタン -->
<form action="setid.php" method="post">
<input type="submit" name="del_id" value="IDを削除">
</form>
<br>

<!-- Cookie表示 -->
<?php print_r($_COOKIE); ?>
</body>
</html>
    • good
    • 0
この回答へのお礼

$_COOKIE[]に変数を入れておけばいいんですね。

かなり詳しいご回答ありがとうございました!
細かい修正もしていただいて嬉しいです。

お礼日時:2011/10/18 02:12

formとcookie set用削除用にページを分けない方法については、既に回答があるので、他の多くのページに実装する方法について


a.No2さんご回答の、最初の条件切り分け部分と、form出力部分とを個別に関数にする
b.別のファイルにこの2つの関数だけ記述
c.目的ページ用のphp に先頭でrequire_onceで関数記述phpを取り込み、まず条件切り分け用の関数を呼ぶ。
さらにページ内のformを表示したい位置で、form出力用の関数を呼ぶ。

あと、ページ内に 他から送られてきたデータ($_POST,$_GETだけでなく$_COOKIEも含む)を表示するときは、htmlspecialchars でサニタイズしてください。特に、input 要素の value 属性値に入れるときは必ず。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
htmlspecialchars でサニタイズしておくよう心がけます。

お礼日時:2011/10/18 02:09

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