PHPについて質問です。


クッキーの初期化について教えていただけないでしょうか?

$_COOKIE['order']="";

と自分が作った$_COOKIE['order']の値をこれで初期化しようと思ったのですが実際には無理でした。

お手数をおかけしますがよろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/06/29 23:15:32
  • 終了:2009/07/03 20:05:34

ベストアンサー

id:sphire No.7

sphire回答回数115ベストアンサー獲得回数122009/07/03 09:47:46

ポイント100pt

http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php のソース抜粋

<FORM method="POST"action="/katarogu_tyuumon.php"><input type="submit" name="subete" value="全て削除する">
</form>

の「method="POST"」と「action="/katarogu_tyuumon.php"」の間にスペースが無い?のがすごく気になる;

ところで、上記「全て削除する」formのaction先を別のスクリプトにしてみませんか?

以下のような感じで…

katarogu_tyuumon.php の「全て削除する」form を以下のように書き換え

<form method="post" action="/katarogu_sakujo.php">
<input type="submit" value="全て削除する">
</form>

katarogu_sakujo.php を新規作成

<?php
setcookie('order',false,time()-3600,'/');
header('Location: http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php');
exit;
?>

試してもらえると幸いです。

id:aiomock

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

試して一回外部へ飛ばして行ってみましたが無理でした。。。

ほかの方法を探してみようと思います。

2009/07/03 12:17:24

その他の回答(6件)

id:v_i_e_w No.1

v_i_e_w回答回数160ベストアンサー獲得回数42009/06/29 23:19:32

ポイント18pt

http://www.scollabo.com/banban/php/ref/ref_setcookie.html

setcookie( )を用いてください。

id:aiomock

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



$_COOKIE['order']の値をすべて削除したいので

setcookie ('order',"");



としたのですが全てのデータが削除されないのはなぜでしょうか。

お手数をおかけしますがよろしくお願いします。

2009/06/29 23:42:54
id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/06/30 00:30:03

ポイント17pt

http://jp2.php.net/setcookie


setcookie('order', '', time()-3600);

とかだとどうでしょうか?

第3引数で、有効期限を設定する必要があります。

また、第4引数でクッキーの有効なパスを、第5引数で有効なドメインを指定することもできますので

クッキーをセットしたときと同じパラメータを与える必要があります。

そもそも、ご自身のサーバにてセットしたクッキーである必要があるのですが、そこの認識に間違いはないでしょうか?

#よそのサーバでセットされたクッキーを消すにはその方法では無理ですよ。

id:aiomock

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

有効期限設定してみました。

がしかしクッキーが初期化されないです。。

クッキーを設定したときと同じパラーメータ設定しました。(自分の場合は第三引数までしか設定していないので問題ないと思います。)

自分が現在作成したページはさくらサーバーという会社のところにあって、そこでクリックしたりしたデータをPCのクッキーに保存するという形式を取っているのですが

この形はまずいのでしょうか?

2009/06/30 00:46:57
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012009/06/30 02:22:32

ポイント17pt

setcookie() は他の何よりも先に出力されなければなりません。


htmlタグなどの後に来ているようであれば、

最も冒頭でsetcookie('order', '', time()-3600);を、

実施するように改良してみてください。


if (isset($_POST['subete'])) { // 「すべて削除する」が押された場合の処理
    setcookie('order', '', time()-3600);
}
id:aiomock

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

冒頭で設置してみたのですが無理でした。

ボタンを押した後は

<FORM method="POST"action="<?php echo $_SERVER['PHP_SELF'];?>">

で一度再読み込みをして一番最初に

if (isset($_POST['subete'])) { // 「すべて削除する」が押された場合の処理

setcookie('order', '', time()-3600);

}


の設置をしましたが未だ機能しないです。

何が問題なのでしょうか。。。

2009/06/30 14:17:53
id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332009/06/30 08:09:57

ポイント17pt

setcookie で Cookie を削除するには、HTMLへの出力を行う前にブラウザへ指示を送らなければなりません。これだと使い勝手が悪いので、クライアントサイド(JavaScript)で削除指定してはどうでしょう。下記参照。

<script language="JavaScript" type="text/javascript">
<!--
// クッキーの削除
function deleteCookie() {
   name = "order=";    //削除するクッキー名
   tt = new Date();
   tt.setYear(tt.getYear() - 1);
   document.cookie = name + ";expires=" + tt.toGMTString();
}
//-->
</script>

―(中略)―

<input type="button" value="すべて削除する" onClick="deleteCookie()">
id:aiomock

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

javascript でのやり方を教えていただいてありがとうございます。

このスクリプトを貼り付けて行ったのですが、機能しません。。

どこか問題があるのでしょうか?

javascriptは行ったことがないのでどこがどうなっているのか非常につかみずらいです。。。

2009/06/30 14:19:25
id:kmond2 No.5

kmond2回答回数31ベストアンサー獲得回数22009/06/30 13:58:03

ポイント17pt

普通はJavaScriptで削除します。

http://tectec.maromaro.jp/modules/smartsection/item.php?itemid=7

id:aiomock

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

2009/06/30 14:05:19
id:hijk05 No.6

hijk05回答回数1307ベストアンサー獲得回数232009/06/30 18:45:23

ポイント17pt

クッキーを配列で入れてるのではないでしょうか?

http://blog.ohgaki.net/phpa_r_post_get_cookiea_reb_cana_le_a_a

id:aiomock

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

2009/06/30 18:56:11
id:sphire No.7

sphire回答回数115ベストアンサー獲得回数122009/07/03 09:47:46ここでベストアンサー

ポイント100pt

http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php のソース抜粋

<FORM method="POST"action="/katarogu_tyuumon.php"><input type="submit" name="subete" value="全て削除する">
</form>

の「method="POST"」と「action="/katarogu_tyuumon.php"」の間にスペースが無い?のがすごく気になる;

ところで、上記「全て削除する」formのaction先を別のスクリプトにしてみませんか?

以下のような感じで…

katarogu_tyuumon.php の「全て削除する」form を以下のように書き換え

<form method="post" action="/katarogu_sakujo.php">
<input type="submit" value="全て削除する">
</form>

katarogu_sakujo.php を新規作成

<?php
setcookie('order',false,time()-3600,'/');
header('Location: http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php');
exit;
?>

試してもらえると幸いです。

id:aiomock

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

試して一回外部へ飛ばして行ってみましたが無理でした。。。

ほかの方法を探してみようと思います。

2009/07/03 12:17:24
  • id:aiomock
    現在カタログページを作成中です。

    http://oskuni7.sakura.ne.jp/katarogu.php

    問題のページは確認画面のページなのですが

    http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php

    ここの画面の すべて削除する のボタンを押したときにクッキーの値を全て初期化したいと考えています。

    ここを押すと初期化するにはどのようなクッキーの命令が必要でしょうか?

    お手数をおかけしますがわかる方おりましたらご回答をよろしくお願いします。
  • id:kn1967
    クッキーの削除だけじゃなくて画面の書き換えも必要になるから、
    JavaScriptで行うなら、
    クッキー情報消去後に画面遷移するようにしないといけませんね。
    location.href = "http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php";

    でも、これを受け入れるようにしてしまうと、
    クライアントサイドでクッキー弄られやすくなるので、どうかな~~~?

    セキュリティの話をしだすと、セッション使えというような話になるだろうし、
    とりあえず練習台だからと割り切って使うのはOKかな。

    でも、phpの練習中にJAVAScript絡めると話がややこしくなるし、
    練習だからこそphpでクッキー扱うべきだとも思うんですよね。

    とやかくいっても、選ぶのは aiomock さんのお心次第ですから、
    とりあえず、この辺で。
  • id:kn1967
    コメント書いている間にお返事が・・・汗;

    >冒頭で設置してみたのですが無理でした。

    ちょこっとコメント欄に書いて消したものがそちらにはメールで残っていると思いますが、
    消した後で、再度書き込んでたりしてそうな感じが強まりました。

    ソース開示してもらえます?
  • id:kmond2
    > kn1967 2009-06-30 14:27:15
    > でも、これを受け入れるようにしてしまうと、
    > クライアントサイドでクッキー弄られやすくなるので、どうかな~~~?

    Cookieはブラウザ(クライアント・サイド)で制御するものなのですが、何か勘違いしていませんか?(今度はコメントを消さないでくださいよ!)


    >質問者の方へ
    Cookieを消去するJavaScriptを含めたHTMLコンテンツを、Cookieを登録したのと同じドメイン(サーバ)にアップしましたか?
  • id:aiomock
    kn1967さん

    コードをアップしました。

    お手数をおかけしますがよろしくお願いします。

    http://oskuni7.sakura.ne.jp/katarogu_tyuumon.phps
  • id:aiomock
    kmond2 さん

    クッキーを登録したところと同じ場所にジャバスクリプトを置くわけですね。

    行っていないので少しやってみます。
  • id:kn1967
    冒頭で
      setcookie('order', '', time()-3600);
    を行った後、これが有効になるのは次回アクセス時です。

    従いまして、
      //配列を順に表示させる
    という foreachループ(もしくはテーブル全体)は
    if (!isset($_POST['subete'])) {
    }
    といった具合にして「すべて削除する」が押された場合は、
    表示されないようにするための措置が必要になります。
  • id:aiomock
    kn1967 さん

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

    実際にif文を用いて行ってみたのですが

    画面上から消えることはあってもクッキーが初期化されることはなく、カタログのホームページで商品を追加すると前回のクッキーの状態がそのまま反映され、初期化されない状態になります。

    次回アクセス時というのは 

    ボタンを押して、ページを移動した後、また全て削除するのボタンがあるページへ移動したときの事を言うのでしょうか?
  • id:kn1967
    (1)katarogu_tyuumon.php の問題
    処理の流れとしては、
    (1)クライアントからサーバへ ページ呼び出し
        ↓
    (2)サーバからクライアントへ クッキー引渡し要請
        ↓
    (3)クライアントからクッキーの値を受け取って $_COOKIE にセット。
        ↓
    (4)サーバからクライアントにページの内容を返す処理を開始する。
      冒頭8で setcookie が行われ、クライアントにクッキーのクリアを指示する。
      ($_COOKIE の値は変化しない)
    となりますので $_COOKIE をそのまま使うと以前の値のままになっています。
    今回は if で囲ってしまうという手を使いました。
    (他にも方法はありますが、長くなるので割愛。)


    (2)他のページとの連携問題
    クッキーは発行したページに対して有効になりますので、
    katarogu_tyuumon.php で発行したクッキーと
    katarogu.php で発行したクッキーは別物として存在することになります。

    共通のクッキーにしたい場合は4番目以降の指定も必要になります。
    詳細は http://jp2.php.net/setcookie を確認してください。

    4番目の引数として '/' を渡しておけば、
    http://oskuni7.sakura.ne.jp/ 内すべてで共通のクッキーを使うようになるはずですが、
    未確認ですので5番目以降の指定も必要になるかもしれません。
  • id:kmond2
    > kn1967 2009-06-30 23:34:21
    > クッキーは発行したページに対して有効になりますので、
    > katarogu_tyuumon.php で発行したクッキーと
    > katarogu.php で発行したクッキーは別物として存在することになります。

    おいおい、真っ赤な嘘を書かないように。
    Cookie はドメインに対して設定されるものでしょ。
    貴君のコメントは質問者を混乱させるだけだよ。

    なお、訂正するのであれば、既存のコメントを消さないで頼みますよ。
  • id:aiomock
    第5引数まで渡しましたが変更できませんでした。。

    一度すべてのクッキーを第五引数まで設定した際ですが、今まで一つ一つ消せたものも消せなくなりました。

    その時のひとつひとつのクッキーの設定状況なのですが

    ★★追加するページのクッキーのコードは

    setcookie ("order[$name]", "$order", time()+600,'/','.oskuni7.sakura.ne.jp');

    削除するページのコードは

    setcookie('order',"",time()-600,'/','oskuni7.sakura.ne.jp');

    全体の削除のページは 

    setcookie('order',"",time()-600,'/','oskuni7.sakura.ne.jp');

    こうしたのですが無理でした。

    ☆☆追加するクッキーのコードは

    setcookie ("order[$name]", "$order", time()+600);

    削除するコードは

    setcookie('order',"")

    全体の削除は

    setcookie('order',"",time()-600);

    この時はうまくかみ合います(一つ一つ消せれる状況にはなります)。相変わらず全体の削除は機能しないですが・・・

    急いで元に戻したのですがこれはどのような事が考えられるのでしょうか?

    また、

    ★★追加するクッキーのコードは

    setcookie ("order[$name]", "$order");

    削除するコードは

    setcookie('order',"");

    全体の削除は 

    setcookie('order',"");

    このコードを打った時もまったく機能しませんでした。。


    また今作成しているカタログを元にほぼ全く同じページをサーバー上にフォルダを作成しひとつ作成したのですが、そのページはまったく同じ状態に設定したカタログなのに一つ一つの商品を消せない状況になっています。

    http://oskuni7.sakura.ne.jp/F_katarogu/mixi/katarogu.php

    クッキーを使って作成しているのですが段々とよくわからない状況に突入してしまい困惑しております。。。。


  • id:sphire
    やっとわかりました、、
    katarogu_sakujo.php を以下のようにかえてください。
    >||
    <?php
    if (isset($_COOKIE['order'])) {
    foreach ($_COOKIE['order'] as $key => $value) {
    setcookie('order[' . $key . ']', '', time()-3600, '/');
    }
    setcookie('order', '', time()-3600, '/');
    }
    header('Location: http://oskuni7.sakura.ne.jp/katarogu_tyuumon.php');
    exit;
    ?>
    ||<
  • id:aiomock
    sphire さん

    実行できました。

    本当にありがとうございます。

    大変助かりました!!!。

  • id:sphire
    解消してよかったです。
    http://jp2.php.net/manual/ja/function.setcookie.php#87525 あたりのUser Contributed Notesに記述がありますが
    Cookieは普通の配列と同じには扱えません。似て非なるものです。

    実装見ないとなかなか問題を把握できないので、情報開示は大切ですね。
  • id:aiomock
    ご回答本当にありがとうございます^^。

    質問の際なるべく情報を開示する必要性があること改めて感じました。

    次回以降の質問より改善したいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません