フォームの内容をクッキーに保存する

このQ&Aのポイント
  • フォームの内容をクッキーに保存する方法について教えてください。
  • フォームの入力内容をsubmitボタンでクッキーに保存しようとすると、保存が1回遅れて行われます。前回保存した内容がクッキーに保存されます。
  • POST変数の順番がおかしいのでしょうか?ご教示ください。
回答を見る
  • ベストアンサー

フォームの内容をクッキーに保存する

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>

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

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>

tomorrow_005
質問者

お礼

$_COOKIE[]に変数を入れておけばいいんですね。 かなり詳しいご回答ありがとうございました! 細かい修正もしていただいて嬉しいです。

その他の回答 (2)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

formとcookie set用削除用にページを分けない方法については、既に回答があるので、他の多くのページに実装する方法について a.No2さんご回答の、最初の条件切り分け部分と、form出力部分とを個別に関数にする b.別のファイルにこの2つの関数だけ記述 c.目的ページ用のphp に先頭でrequire_onceで関数記述phpを取り込み、まず条件切り分け用の関数を呼ぶ。 さらにページ内のformを表示したい位置で、form出力用の関数を呼ぶ。 あと、ページ内に 他から送られてきたデータ($_POST,$_GETだけでなく$_COOKIEも含む)を表示するときは、htmlspecialchars でサニタイズしてください。特に、input 要素の value 属性値に入れるときは必ず。

tomorrow_005
質問者

お礼

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

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

ソース全部書いててくれてありがとうございます。 とても楽にテストする事ができました。 ちゃんと説明しようかと思ったのですが、書いているうちに自分でわけ分らなくなってきたので、簡単に説明します。 一回目にテキストボックスに[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

tomorrow_005
質問者

お礼

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

tomorrow_005
質問者

補足

早速のご回答ありがとうございます。 > んで、疑問なのは なぜに 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>

関連するQ&A

  • radio選択をクッキーに保存させる方法について

    こんにちは。 PHPでメタサーチを作っています。 複数の検索サイト(Yahoo!、Google等)から選択し、 検索窓に入力した値を検索サイトに送り、 iframe内に表示するようにしました。 さらに、サイトに再訪問時に、 ラジオボタンのの選択を前回と同様にしたいと思っています。 しかし、ラジオボタンのcookie保存・読み込みがうまくいきません。 PHP、JavaScript、jQueryと、様々な方法を試してみたのですが、 うまくいかず、よくわからなくなってきました。 値の取得方法に問題があるのでしょうか? ご教示お願い致します。 ※現在、jQuery使用でプログラムを組もうとしていますが、 PHPで可能であれば、その方法でもかまいません。 search4.php <?php $keyword=$_GET["keyword"]; $keyword4url=urlencode($keyword); ?> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript" src="jquery-1.6.4.js"></script> <script type="text/javascript" src="jquery.cookie.js"></script> <script type="text/javascript"> function P1(w1){parent.frame1.location.href=w1} //チェック状態保存 function saveChk(){ for(var i=1;i<3;i++){ if($("#chk_"+i).attr("checked")){ $.cookie('chk_'+i,'1'); } else{ $.cookie('chk_'+i,null); } } } //チェック状態読み込み function initChk(){ for(var i=1;i<3;i++){ if($.cookie('chk_'+i)){ $("#chk_"+i).attr("checked",true); } } } //ページ表示時 $(function($){ initChk(); }); </script> </head> <body> <center> <form action="search4.php" method="get"> キーワード:<input type="text" name="keyword" size="20" value="<?php echo $keyword;?>" onfocus="this.select()"> を <input id="chk_1" type="radio" name="RB1" onClick="P1('http://search.yahoo.co.jp/search?p=<?php echo $keyword4url; ?>');saveChk();" checked>Yahoo! <input id="chk_2" type="radio" name="RB1" onClick="P1('http://www.google.co.jp/#q=<?php echo $keyword4url; ?>');saveChk();">Google で <input type="submit" value="検索する" onclick="saveChk();"> </form> <br> <iframe src="http://search.yahoo.co.jp/search?p=<?php echo $keyword4url; ?>" name="frame1" frameborder="1" scrolling="auto" width="977" height="600"> </iframe> </center> </body> </html>

  • cookieでチェックボックスの状態を保存したい

    保存ボタンを押すと、チェック状態をcookieで保存する機能を実装したいと考えています。 <form name="frmOutput" method="get" action="#"> <input name="time[]" type="checkbox" value="morning" id="morning" <?php if (in_array('morning', $times)) {?>checked="checked"<?php } ?> > <label for="morning">朝</label> <input name="time[]" type="checkbox" value="noon" id="noon" <?php if (in_array('noon', $times)) {?>checked="checked"<?php } ?> ><label for="noon">昼</label> <input name="time[]" type="checkbox" value="evening" id="evening" <?php if (in_array('evening', $times)) {?>checked="checked"<?php } ?> ><label for="evening" >夜</label> <input type="submit" name="submit_1" value="保存" onClick="recordTime(); return false;" /> この保存ボタンを押すと、JavaScriptで書いたrecordTimeで、チェックされているcheckboxの値を取得します。 <script src="./jquery.js" type="text/javascript"></script> <script language="JavaScript"> <!-- function recordTime() { var checkList = new Array(document.getElementById('morning'), document.getElementById('noon'), document.getElementById('evening')); var times = new Array(); for (i = 0; i < checkList.length; ++i) { if (checkList[i].checked) { times.push(checkList[i].value); } } $.get("./index.php", { "time[]": times, "record": 1 }); } --> </script> 値がセットされていればcookieに書き込みを行い、リロードすると保存時のチェック状態が再現されます。 <?php if (isset($_GET['record'])) { $times = $_GET['times']; $tmp = serialize($times); echo $tmp; setcookie('times', $tmp, time() + 30 * 60*60*24); exit; } $tmp = $_COOKIE['times']; $tmp = stripslashes($tmp); $times = unserialize($tmp); if ($times === false) { echo "unserialize failed."; } ?> 以上のコードなのですが、うまくcookieに保存されません。 これとは別にcookieを削除するボタンも作っており、 この削除ボタンでcookieの有効期限を過去にして削除してから、 動作がおかしくなったように感じていますが、 原因がはっきり分かりません。 知識を持っておられる方がいらっしゃれば、 教えて頂ければ助かります。 よろしくお願いしますm(__)m

  • フォームボタンのvalueを渡すにはどうしたらいいのでしょうか?

    下記のソースのように「word」というテキストフィールドの 入力チェック後ボタンのvalueをword.phpに渡したいのですがどのようにしたらいいのでしょうか? 入力チェックをせず input type="button"ではなくinput type="submit" にするとword.phpに渡せるのですが・・・ ようはA、B、Cそれぞれのボタンを押した時で word.phpでbtnのvalueをPOSTで受け取り 処理をvalue A、B、Cで分岐させたいんです。 よろしくお願いします。 <html> <head> <SCRIPT language="JavaScript"> <!-- function chk(chkfrm){ var tmp = chkfrm.word.value.length; if(tmp > 50 ){ alert("文字数が多すぎます"); } else{ chkfrm.submit(); } } //--> </SCRIPT> </head> <body> <form name="form" method="post" action="word.php"> <input name="word" type="text" id="word"> <input type="button" name="btn" value="A" onclick="chk(this.form);"> <input type="button" name="btn" value="B" onclick="chk(this.form);"> <input type="button" name="btn" value="C" onclick="chk(this.form);"> </form> </body> </html>

  • サイト内にGoogleサイトを表示する方法

    こんにちは。 先日からPHPでメタサーチを作っています。 先日の質問 http://okwave.jp/qa/q7027045.html 複数の検索サイト(Yahoo!、Google等)から選択し、 検索窓に入力した値を検索サイトに送り、 iframe内に表示するようにしました。 しかし本日の昼頃から、Googleの検索結果が表示されなくなりました。 IE9では 「この Web サイトに入力する情報のセキュリティを保護するため、このコンテンツの発行者はフレーム内での表示を許可していません。」 と表示され、 FireFox、chromeではエラーすら表示されません。 iframeに問題があるのでしょうか? objectタグ使用でも変化がなく、 php includeでも表示されませんでした。 Googleの公式サイトを表示する、他の方法がありますでしょうか? ご教示お願い致します。 以下、ソースです。 search5.php <?php if (isset($_GET["keyword"])){ $keyword=$_GET["keyword"]; }else{ $keyword=""; } $keyword4url=urlencode($keyword); ?> <?PHP if (isset($_COOKIE["chk_1"])){ $checked["chk_1"]=" checked"; }else{ $checked["chk_1"]=""; } if (isset($_COOKIE["chk_2"])){ $checked["chk_2"]=" checked"; }else{ $checked["chk_2"]=""; } print_r($_COOKIE); ?> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript"> function P1(w1){parent.frame1.location.href=w1} 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; }; function delCookie(key){ expiredate = new Date(); expiredate.setYear(expiredate.getYear()-1); tmp = key+"=;"; tmp += "expires="+expiredate.toGMTString(); document.cookie = tmp; }; function set_cookie_radio(){ delCookie("chk_1"); delCookie("chk_2"); if(document.getElementById("chk_1").checked) setCookie("chk_1","1"); if(document.getElementById("chk_2").checked) setCookie("chk_2","1"); } function del_cookie_radio(){ delCookie("chk_1"); delCookie("chk_2"); } </script> </head> <body> <center> <form action="search5.php" method="get"> キーワード:<input type="text" name="keyword" size="20" value="<?php echo $keyword;?>" onfocus="this.select()"> を <input type="submit" value="検索する"> </form> <form> <input type="button" value="クッキー削除" onclick="del_cookie_radio()"> </form> <form> <input id="chk_1" type="radio" name="RB1" onClick="P1('http://search.yahoo.co.jp/search?p=<?php echo $keyword4url; ?>');set_cookie_radio()" <?PHP echo $checked["chk_1"];?>>Yahoo! <input id="chk_2" type="radio" name="RB1" onClick="P1('http://www.google.co.jp/#q=<?php echo $keyword4url; ?>');set_cookie_radio()" <?PHP echo $checked["chk_2"];?>>Google </form> <iframe src="http://search.yahoo.co.jp/search?p=<?php echo $keyword4url; ?>" name="frame1" frameborder="1" scrolling="auto" width="977" height="600"> </iframe> </center> </body> </html>

  • フォームの「キャンセル」ボタンを押すと登録されてしまう…

    以下のようなフォームをつくっているのですが、どうもキャンセルを押すと登録されてしまいます。ごうしたらよいでしょうか? <form id='next' name='next' method='post' action='XXX.php'> <INPUT name='next' type='submit' id='next' value='登録する'> <INPUT type='button' value=' 戻る ' onClick='history.back()'> <INPUT name='cancel' type='submit' value='キャンセル' onClick='index.html'>

    • ベストアンサー
    • HTML
  • クッキーが保存されずに困っています

    どなたか、詳しい方がおりましたらアドバイスをお願い いたします。私はプログラムを仕事としている者では ありませんが、独学でPHPを勉強しております。 クッキーが保存されなくて困っています。 以下の部分です。 クッキーの有効期間は設定していませんが、ブラウザを 閉じずにテストしていての情況です。 ---------------------------------------------------- ファイル名:rogin.php <?php setcookie("userck","ckdata=100"); print $_COOKIE[userck]; ?> <html> <body> <br><br><br> <center> <table border="1"> <form method="post" action="<?=*********"> <tr> <td> Email: </td> <td><input type="text" name="data1" size="30"> </td> </tr> <tr> <td> pass: </td> <td><input type="text" name="data2" size="30"> </td> <tr> <td colspan="2" align="center"> <input type="submit" name="sousin" value="送信"> </td> </tr> </form> </center> </body> </html> ---------------------------------------------------- どうしてクッキーが保存されないのか自分なりにいろいろと 調べたり、テストをしてみたりしました。 テストの内容 test1.php <?php setcookie("userck","ckdata=100"); ?> test2.php <?php print $_COOKIE[userck]; ?> 上の2つのファイルを作成して、test2.phpで出力してくるか どうかを試してみますと、問題なく「data=10」が出力されて きます。(保存されているかどうかだけを調べたいので、 parse_strは省略しています。) ところが、問題のrogin.phpでクッキーを保存して別のファイル で$_COOKIE[userck]を取得しようとしてもどうやら保存されて いないようです。 rogin.phpの内部に記載した、print $_COOKIE[userck];では ckdata=100は出力してきます。 それではと思い、test1.phpでセットしたクッキーはrogin.phpで 取得できるのかどうかをテストしてみますと、無事に取得できます。 setcookie()の前にはHTMLの出力はありません。 クッキー名にアンダーバーも使っていません。 何か、php.iniに関係するのかと思い、一応iniファイルに output_buffering = On を書き足したりもしました。 クッキーが保存されない原因で、考えられることはどんなこと なのかが知りたいです。 どなたか、お分かりになる方アドバイスをお願いできないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • javascriptでクッキーの読み出し

    お世話になります。 下記のjavascriptで、あらかじめ取得したクッキーを html内に表示させ、且つ他のページへ情報を送る 方法を調べていますがうまくいきません。 フォームのインプットタイプテキストを利用すれば、 表示されますが、それ以外の方法がございましたら、 ご教示いただければと思います。 よろしくお願いいたします。 <!-- 表示確認 --> <input type="text" id="id" value=""><br> <input type="text" id="url" value=""><br> <html> <head> <script type="text/javascript"> <!-- function load() { // クッキーから読み込んだ値を、『url』『id』要素に設定 document.getElementById("url").value = readCookie("url"); document.getElementById("id").value = readCookie("id"); } function readCookie(key) { if (key == "") return; // クッキーの文字列『key1=value; key2=value; …』から、 // 引数の『key』を元に、正規表現で値を検索 var re = new RegExp(escape(key) + "=(.*?)(?:;|$)"); if (document.cookie.match(re)) return unescape(RegExp.$1); return ""; } // --> </script> </head> <body onload="load();"> <!-- 表示確認 --> <input type="text" id="id" value=""><br> <input type="text" id="url" value=""><br> <br> <br> <!-- 表示確認できない --> <span id="id" value=""></span><br> <span id="url" value=""></span><br> </body> </html>

  • POST送信かGET送信か

       ------------------------------------------ <SCRIPT language="JavaScript"><!-- function GoPage(url, id){ document.form.action = url; document.form.id.value = id; document.form.submit(true) } // --></script> <!--中略--> <input type="submit" name="submit" value="送信" onClick="javascript:GoPage("a.php", "1")">    ------------------------------------------    上記のような処理を書いた場合、 遷移先である a.php で id(値:1)を取得する時は POSTで受け取るのですか?それともGETでしょうか?   

  • IEでのフォームメールで、ENTERキーでのsubmitを動かさないようにしたいのですが。。

    IEでフォームメールを使用したときにENTERキーを押下するとsubmitが動いてしまうのですが、その動きを止める為に 1.送信ボタンは   <input type="button" name="submit" value=" 送信する " onClick="subm()"> で関数subm()で function subm() { document.form1.submit(); } という動きと 2.送信ボタンに<input type="button" name="submit" value=" 送信する " onClick="javascript:document.form1.submit()"> という動きの2つを試してみたのですが、どちらもエラーになってしまいました。 原因がわからないので調べているところですが、もしどなたか他の方法をご存知でしたら、教えていただけませんでしょうか?

  • 外部からgetされた内容をクッキーに書き込みたい

    お世話になります。 外部URLからgetされる内容をCookieに書き込んで利用したいのですが、うまくいきません。 外部から送られてくる内容は以下のものです。 <form method="get" action="https://www.xxxxxxxx/kiyaku.html" target="_blank"> <input type="hidden" name="id_agency" value="00000000"> <input type="image" name="submit" src="images/b.gif"> </form> 読み書き用のjavascriptとして、以下のものを作ってみました。 cookie.js ckary = new Array(); //setcookie ここから function setck(){ ckary[0] = document.forms[0].id_agency.value; exp=new Date(); exp.setTime(exp.getTime()+1000*60*60*24*60); ckstr = escape(ckary[0]); i = 1; while (ckary[i]){ ckstr += "%00" + escape(ckary[i]); i++; } document.cookie = "XX_Agency=" + ckstr + "; expires=" + exp.toGMTString(); } //setcookie ここまで //getcookie ここから function getck(){ cklng = document.cookie.length; ckary = document.cookie.split("; "); ckstr = ""; i = 0; while (ckary[i]){ if (ckary[i].substr(0,10) == "XX_Agency="){ ckstr = ckary[i].substr(10,ckary[i].length); break; } i++; } ckary = ckstr.split("%00"); if (ckary[0]) document.forms[0].id_agency.value = unescape(ckary[0]); } //getcookie ここまで javascriptはあまりわかりませんので、本を引きながら作っています。どなたか、指摘お願いします。

専門家に質問してみよう