- ベストアンサー
フォームの内容をクッキーに保存する
- フォームの内容をクッキーに保存する方法について教えてください。
- フォームの入力内容をsubmitボタンでクッキーに保存しようとすると、保存が1回遅れて行われます。前回保存した内容がクッキーに保存されます。
- POST変数の順番がおかしいのでしょうか?ご教示ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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>
その他の回答 (2)
- mpro-gram
- ベストアンサー率74% (170/228)
formとcookie set用削除用にページを分けない方法については、既に回答があるので、他の多くのページに実装する方法について a.No2さんご回答の、最初の条件切り分け部分と、form出力部分とを個別に関数にする b.別のファイルにこの2つの関数だけ記述 c.目的ページ用のphp に先頭でrequire_onceで関数記述phpを取り込み、まず条件切り分け用の関数を呼ぶ。 さらにページ内のformを表示したい位置で、form出力用の関数を呼ぶ。 あと、ページ内に 他から送られてきたデータ($_POST,$_GETだけでなく$_COOKIEも含む)を表示するときは、htmlspecialchars でサニタイズしてください。特に、input 要素の value 属性値に入れるときは必ず。
お礼
アドバイスありがとうございます。 htmlspecialchars でサニタイズしておくよう心がけます。
- bm_hiro
- ベストアンサー率51% (200/388)
ソース全部書いててくれてありがとうございます。 とても楽にテストする事ができました。 ちゃんと説明しようかと思ったのですが、書いているうちに自分でわけ分らなくなってきたので、簡単に説明します。 一回目にテキストボックスに[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>
お礼
$_COOKIE[]に変数を入れておけばいいんですね。 かなり詳しいご回答ありがとうございました! 細かい修正もしていただいて嬉しいです。