質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    20356questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    2311questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

cookieの名前を配列にしてクッキーを複数生成したいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 217

akobayashi

score 9

前回、cookieを配列に入れるコードを作ったのですが、
今度は選択したクッキーが削除ができなくて、削除するにはどうしたらよいかを考えたのですが、
cookieの名前を配列にして、見たページを削除する方法を探していますが、
以下のコードだと上書きされてしまいまして、どうしたらよいかお知恵を頂戴したく思います。
cakephpを使っているのですが、

修正コードでございます。
<?php
  if(isset($_COOKIE['user_title'])){
      $values = array();
      $value = $list['0']['Encode']['title'];
      $values[] = $value;
      $ligetime = 1800;
      foreach($values as $key => $tomato){
      $key++;
      setcookie('user_title'.$key,$tomato,time() + $ligetime, '/' );
    }
  }else{
      $ligetime = 1800;
      $value = $list['0']['Encode']['title'];
      setcookie('user_title',$value,time() + $ligetime, '/' );
  }


?>


これでelseにまで処理がいくのですが、
クッキーを見てみると
user_title
user_title1
で止まっちゃってました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

$values[] = $value;
$ligettime = 1800;
foreach($values as $key => $tomato){
$key++;
setcookie('user_title'.$namu,$tomato,time() + $ligetime, '/' );
}

全体的におかしいですね
$valueはどこからくるのでしょうか?
$values[]してforeachで回しても要素は1つしかないですよね?
'user_title'.$namuしてますが$namuが定義されていません。
結局なにをしたいのかわかりません。

elseの方で
'user_title'.$key
をキーにしてクッキーを保存しても、
'user_title'
は設定されていないなら、結局elseにしか処理がいかないのでは?

 sample

参考までに

<?php
$val="あああ";
$ligetime = 1800;
if(isset($_COOKIE['user_title'])){
  $vals=json_decode($_COOKIE['user_title']);
  $vals[]=$val;
  setcookie('user_title',json_encode($vals),time() + $ligetime);
}else{
  setcookie('user_title',json_encode([$val]),time() + $ligetime);
}
?>
<script>
var user_title=JSON.parse(unescape(getCookie("user_title")));
console.log(user_title);
if(user_title.length>5) delCookie('user_title');
function getCookie(key){
  var params  = document.cookie.split(/; */);
  var ret=null;
  for(var i=0;i<params.length;i++){
    if(r=params[i].match(new RegExp("^"+key+"="+"(.*)"))){
      ret=r[1];
    }
  }
  return ret;
}
function delCookie(key){
    expiredate = new Date();
    expiredate.setYear(expiredate.getYear()-1);
    tmp = key+"=;";
    tmp += "expires="+expiredate.toGMTString();
    document.cookie = tmp;
};
</script>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/26 16:52

    申し訳ありません。なんか色々間違っちゃてました。質問している内容がおかしくて申し訳ありません。すぐに修正させていただきます。

    キャンセル

  • 2017/12/26 17:00

    コードの編集をさせていただきました。
    elseにまで処理がいくのですが、
    クッキーを見てみると
    user_title
    user_title1
    で止まっちゃってました。

    キャンセル

  • 2017/12/26 17:07

    前回も書きましたが
    $values[] = $value;
    で設定されるのは
    $values[0]=$value;
    という要素を一つもった配列です
    $keyをインクリメントしてキー名を利用しているので
    クッキー:user_title1
    は設定されますが、それ以降は回るようなロジックになっていません。

    なにをどうしたときにどういう結果を期待しているか順序立てて
    説明されたほうがよいとおもいます

    キャンセル

  • 2017/12/26 17:17

    はい、説明がなってなくて申し訳ありません。

    >$values[] = $value;
    >で設定されるのは
    >$values[0]=$value;
    >という要素を一つもった配列です
    >$keyをインクリメントしてキー名を利用しているので
    >クッキー:user_title1
    >は設定されますが、それ以降は回るようなロジックになっていません。

    こちらを
    クッキーを複数作りたくて
    user_title[0];
    user_title[1];
    user_title[2];
    と増やしていきたくて、
    現状ですとforeachが最初で止まっているということなので、
    これを回したくてご質問さしあげました。
    何度もご返信いただき申し訳ありません。

    キャンセル

  • 2017/12/26 17:23 編集

    $valueに投入している$list['0']['Encode']['title'];
    はどこからきてるのでしょうか?

    ちなみにクッキーには文字列しか入らないので
    特定のキーをベースに配列にすることはできません。
    配列を代替するためにjsonなどのデータに変換して保持するとよいと思います

    キャンセル

  • 2017/12/26 17:32

    $list['0']['Encode']['title'] はcakephp の メソッドで$listという配列受け取ったデータでございます。
    見ているページのデータになります。
    全てのデータを書くと膨大で見にくくなるのと少し秘密がありますので、省略させていただいております。
    $_SERVER['REQUEST_URI']と同じだと思っていただけますと幸いでございます。

    >jsonなどのデータに変換して保持するとよいと思います
    こちらありがとうございます!試させていただきます!

    キャンセル

  • 2017/12/26 18:05

    更新するたびにuser_listが増えていくsample追記しておきました
    クッキーは文字数制限もあるのでとりあえず6個以上になったら
    削除することにしてあります

    キャンセル

  • 2017/12/26 18:17

    ありがとうございます!
    提示していただきましたコードこそ、
    やりたいこと完璧でした!javascript 解らない私ですが、
    yambejp様のコードを何度も見させていただきます。
    これ$val="あああ";をサイトタイトル(今まで見たページのタイトル$list['0']['Encode']['title']の部分です)に<a>タグを入れてクリックしたらキャッシュを削除する方法を探してみます。

    多分それを実践するのにjavscriptが必要でしょうか?

    キャンセル

  • 2017/12/26 18:29

    今回のsampleはサーバー側で追加したものをブラウザで参照する方法ですので
    クッキーの編集自体はサーバー側で一通りできると思います
    ページ遷移しても保持していくというのが目的であれば
    制限の多いクッキーよりはセッションの方がサーバー側で管理しやすいと思います。
    もしくはlocalstorageなども選択肢にあがるかもしれません。

    キャンセル

  • 2017/12/26 18:41

    丁寧にお答えしていただき誠にありがとうございます。
    >クッキーの編集自体はサーバー側で一通りできると思います

    ありがとうございますサーバー側でやってみます。クッキーと配列を全部削除することができたんですが、1つ指定したクッキーの削除を模索していましたので、
    なんとかできるようになりたいです。

    >ページ遷移しても保持していくというのが目的であれば
    >制限の多いクッキーよりはセッションの方がサーバー側で管理しやすいと思います。

    ああ、ちょっと考えてたんです。セッションの方がやりやすいんじゃないかって。
    で知人やググって調べてみるとcookieの方が閲覧履歴を作りやすいとお聞きしたので、
    cookieでやることになりまして、そうこうしているうちに時間が過ぎて言ってしまいました。

    >もしくはlocalstorageなども選択肢にあがるかもしれません。
    こちら調べさせていただきます。

    キャンセル

  • 2017/12/27 19:04

    お世話になっております。
    yambejp様
    今回の「cookieの名前を配列にしてクッキーを複数生成したいです。」
    の回答だけではなく、他の質問にもいつも丁寧にご説明していただきまして、ありがとうございます。
    今回私がやろうとしている閲覧履歴、並びに指定した記事の削除。
    こちらyambejp様が以前書いていただきました、session掲示板のコードを変更して、
    使いました所、私の思い描く行動そのままできました。
    今回のcookieのyambejp様のコードを示していただいたのですが、
    ちょっとjavascriptが全く解らないので勉強し直して、再度コードを研究したいと思います。
    いつもありがとうございます。早くyambejp様ぐらいのプログラマーになりたいと思います。
    あ、一つだけご質問ですが、php(もしくはjavascript)の上達には人のコードを見て成長すると誰かから聞きましたが、本当でしょうか?

    キャンセル

  • 2017/12/27 19:17

    うーん、私はプログラマーではないので(汗)
    それに私のプログラム技術は「下の上」くらいです。
    先日も別の掲示板で「おまえの書き込みは一度も参考になったことはない」と
    いわれて、ちょっとだけ凹みました。
    まぁがんばってください

    > php(もしくはjavascript)の上達には人のコードを見て成長する

    なんの言語も基本はパクリですね
    個人的な感想ですが、言語を覚えるのは3つあります。
    (1)人に聞く
    (2)ネットで調べる
    (3)他人のコードをパクる(マネをする)

    長文を丸パクリすると著作権(?)的に問題あるので
    ロジックだけでも借りるようにすれば一気に書けるソースの幅が広がりますね
    あとは細かい機能を組み合わせて使えばそれなりに実用レベルにはなると思います

    キャンセル

  • 2017/12/27 19:21

    なるほど!プログラムに著作権あったんですか?知らなかった!
    参考になりました、これからも人のコードパクりまくります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20356questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CakePHP

    2311questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。