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

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1634閲覧

【jquery】を使いjsonでcookieを保存する方法と、【php】を使いそのcookieを取得する方法

marimon

総合スコア32

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/05/01 19:05

編集2019/05/02 01:50

###実現したいこと
jqueryを使って、jsonでcookieを保存して、その後にそのcookieをphpで取得したいです。

jqueryとphpとそれぞれでわからないところがあるのですが、お聞きしてもよろしいでしょうか?

###jqueryでわからないところ
まずこちらがjqueryです。
1回目には保存できるのですが、2回目に保存ができず悩んでしまいました。

jquery

1$('.send').click(function(){ 2 3 // 現在のcookieを取得する。 4 const arr = ($.cookie(save)) ? $.cookie(save) : [] ; 5 6 // 保存したい配列を作る 7 const hoge = 'hoge'; 8 const hoge = 'fuga'; 9 const add = { 10 'hoge': hoge, 11 'fuga': fuga 12 }; 13 arr.push(add); 14 15 // 配列をjsonにする 16 const setjson = JSON.stringify(arr); 17 18 // 「jquery.cookie.js」というプラグインを使用してcookieを保存 19 $.cookie('save',setjson); 20 21});

ちなみにこのjqueryによって、1回目のクリックで保存されるcookieの値はこうです。
%5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D
(この値がおかしいから、2回目に保存されないのでしょうか?)

###phpでわからないところ
続いてphpです。
cookie('save')を取得し、そのfugaの配列を返したい。と考えているのですが、これがまったくわからず、以下の状態でギブアップです...(;´-`)
(こっちも、上のcookieの値がおかしいから取得できないのでしょうか?)

php

1function get_fuga_for_save(){ 2 $arr = isset($_COOKIE['save']) ? $_COOKIE['save'] : []; 3 $arr_fuga = ($arr) ? array_column($arr, 'fuga') : []; 4 return $arr_fuga; 5}

jqueryかphpどちらかでもいいので、どなたかに教えてもらえましたらうれしく思います。
どうぞよろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/01 20:43

相互に…とのことですが、どこでどのようにやりとりさせていますか?提示の内容だけでは何処からもなにも呼び出されていません
marimon

2019/05/01 20:46

「相互にやりとり」というのは、「jqueryで保存したjsonを、phpで呼び出す」という意味でした。一方通行でしたね。
m.ts10806

2019/05/01 20:49

いずれにしてもphpが呼ばれてる場所もJavaScriptが発火するhtmlもないので再現確認ができません。コードを追記してください
退会済みユーザー

退会済みユーザー

2019/05/02 01:13

phpが実行するタイミング、cookieを操作するタイミング、javascriptが実行するタイミングを、一度時系列的に整理した図を起こさないと、伝わらないんだろうなぁと。
marimon

2019/05/02 01:18

タイミングはわかっています。
退会済みユーザー

退会済みユーザー

2019/05/02 01:26

jQuery.ajax使って元のページとは別のphpを起こしてjsonでPOST送信するような話のことを言っている? それとも、元のページを出力したphp宛に送る想定で考えている? そこがわからない。
marimon

2019/05/02 01:33

ふつうにjqueryでcookieを保存し、その後(ページを再読み込みしたとき)にそのcookieをphpで呼び出すだけですけど。
m.ts10806

2019/05/02 02:23

認識(というか体系的な知識の話)が違うため話が通じていません。結局「phpをどう実行するか」という仕様部分の話です。ajaxなのかフォーム送信なのか、いずれかの手段でphpが動作するサーバーにアクセスをしない限りphpそのものは動きませんよ。
marimon

2019/05/02 03:05

ajaxでもフォーム送信でもないです。ごくごく普通に、最も一般的な方法で、ページにアクセスしたときです。そのときにphpを実行したい。それだけです。
m.ts10806

2019/05/02 03:10

JavaScriptで正常に保存されたあとで何かでphp実行したらとれますよ。こちらは「通常考えられる運用」で提起しているだけです。 質問内容だけでは、どういう順序で実行させようとしているのか、仕様部分が見えないので、そこは要件として具体的に記載する必要がありますし、仕様なので質問者さんしかできません。 どのように使いたいか、そのさきのことでもあれば通常考えられる運用に則りアドバイスは可能ですけど。
marimon

2019/05/02 03:11

どうもありがとうございました。
m.ts10806

2019/05/02 03:35

何がでしょうか? 私は要件を追記していただきたいだけで、具体的な内容にしていただかないと解決にはつながらないという指摘をしています。 質問者さんがJavaScriptやphpに熟知しているのでしたら別に良いのですが、そうではないみたいですので解決に繋がる回答を引き出すための情報の追記が不可欠だということをアドバイスしています。 単にphp実行したいだけならすればいいだけの話ですが、phpの実行すら覚束ないのでしたら尚更です。
marimon

2019/05/02 03:49

仰る通りだと思います。本当にありがとうございました。
m.ts10806

2019/05/02 04:07

追記はしないということでしょうか。
guest

回答2

0

ベストアンサー

cookieにjson形式で保存しているんなら、
phpでもjsonから読み解かないといけない気がするけども。

以下、あくまで机上のコード。

php

1if (isset($_COOKIE['save'])) { 2 $arr = json_decode($_COOKIE['save'], true); 3 var_dump($arr); 4}

ただ、js上でcookie操作するのに関しては、
JavaScriptでcookie処理(読み・書き・削除) - Qiita
【jQuery】「jquery.cookie.js」でcookieを保存&削除する方法!おすすめな使い方もご紹介! | PRAWN COCKTAIL(プロウンカクテル)
とか参照して改善したほうがいいかも。


php

1<?php 2 3$json = '[{\"hoge\":\"hoge\",\"fuga\":\"fuga\"}]'; 4var_dump(json_decode(stripcslashes($json)));

イメージ説明
ってなるんで、一応デコードできてきてるかも。

こういう文字列でcookieに設定されるのは、
javascript - Escaped JSON in PHP $_COOKIE global - Stack Overflow
にあるようにjsonデータからシリアライズするときに、
なにかオプション的なのを足してあげると回避できそう。

さらに参考になるか、追加情報。
【JavaScript】ライブラリを使わずにCookieを読み書きする - Qiita


php

1<?php 2 3$json = '[{"hoge":"hoge","fuga":"fuga"}]'; 4var_dump(json_decode($json, true));

イメージ説明
たぶん、これが正解なんじゃないかなと。

投稿2019/05/02 01:44

編集2019/05/02 06:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimon

2019/05/02 01:47

ありがとうございます。php側でjson_decodeしないといけないんですね。 あと、cookieに保存されるべき値は、質問にあるやつ↓であっていますか? %5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D こう↓じゃないといけないように感じるんですけど。 [{"hoge":"hoge","fuga":"fuga"}]
marimon

2019/05/02 01:52 編集

参考リンクありがとです。けっきょく、正しい値がどういう形なのか?がわからずじまいでした。
退会済みユーザー

退会済みユーザー

2019/05/02 02:00

jsonデータを文字列化(シリアライズ)して文字列にしたものを保存するにしても、cookieの原則に従って保存しないと読み出すことすら困難になるので、ラクにcookieを扱えるライブラリがあるなら頼ってもいいかもね。
marimon

2019/05/02 02:01

わかったらまたいつでもご返信ください。ありがとうございました。
marimon

2019/05/02 05:25 編集

あれからjson_decodeを試したのですが、 $arr = json_decode($_COOKIE['save'], true); var_dump($arr); は NULL でした。 そして var_dump( $_COOKIE['save'] ); は '[{\"hoge\":\"hoge\",\"fuga\":\"fuga\"}]' でした。 つまり後者の文字列(cookieの値)に対してjson_decodeをかけるとNULLになってしまうみたいでして、他に有用そうな関数をご存じではありませんでしょうか?
marimon

2019/05/02 06:07

ご回答ありがとうございます。stripcslashesでスラッシュを消すのはいいですね。 でもこれ↓が少しウザめですね(笑) object(stdClass) でもほんと、なんで 開発ツールで見たときはこう↓なのに、 %5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D それをvar_dump( $_COOKIE['save'] );したらこう↓に勝手に変換されるんでしょう…不思議すぎません? '[{\"hoge\":\"hoge\",\"fuga\":\"fuga\"}]' せめて開発ツールの見た目のままならこう↓できるのに。 $ini = '%5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D'; $decode = rawurldecode($ini); $result = json_decode($decode,true); var_dump($result);
marimon

2019/05/02 06:09

この不思議については改めて質問を立てておこうかと思います。いろいろお世話してくださってありがとうございました。
退会済みユーザー

退会済みユーザー

2019/05/02 06:09

%5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D って、urlエンコードされた文字列なので、デコードすると [{"hoge":"hoge","fuga":"fuga"}] になるんですよ。
marimon

2019/05/02 06:18 編集

そうですよね。そしてそのようにデコードされればいいのですが、実際には var_dump( $_COOKIE['save'] ); は '[{\"hoge\":\"hoge\",\"fuga\":\"fuga\"}]' と不思議なデコード(正規表現てきな?)がされるんですよね。そもそもデコードせずに、開発ツールの見た目のまま出さんかい!っていうかんじですけど(笑) なので、 $json = '[{"hoge":"hoge","fuga":"fuga"}]'; var_dump(json_decode($json, true)); とやりたくでも、その $json のような形では取得できないという…
marimon

2019/05/02 06:24

ということで、教えてもらったスラッシュ削除作戦を使いながら、こう↓ですかね。いちおうできましたけど。いいのかな。 $ini = '[{\"hoge\":\"hoge\",\"fuga\":\"fuga\"}]'; $slash = stripcslashes($ini); $encode = urlencode($slash); $decode = rawurldecode($encode); $result = json_decode($decode,true); var_dump($result);
退会済みユーザー

退会済みユーザー

2019/05/02 06:29

現実的なところでは、その路線でしばらくテストしてみるしか。 日本語を含む場合にどうなるか、よくよくテストしないと。
marimon

2019/05/02 06:32

たーしーかーにー!かにかに!あれこれ問題起こりそうです… ひとまず今回のところはおかげ様で解決いたしました。なんどもすみません。ありがとうございました。また良い方法がわかりましたらご報告さしげますね。
guest

0

jQueryのほうですが、constは定数宣言なので、宣言した時点で値が固定されてその後変更することはできません。letでの宣言に変更してみてください。

js

1let arr = ($.cookie(save)) ? $.cookie(save) : [] ;

PHPのほうは、クライアント (jQuery) 側からどういう呼び出し方をしているのかわからないのでなんとも言えませんが、例えば、クロスドメイン環境 (jQueryとPHPとで設置されているドメインが違う。たとえば片方がhttp://localhostで動いているなど) では、PHP側で Access-Control-Allow-OriginAccess-Control-Allow-Credentials を許可する設定、jQuery側ではwithCredentialsを有効にする設定が必要です。

検証されている環境 (jQueryもPHPも両方ローカルで作業している、片方はWeb上にある、両方Web上にある、その場合はドメインは同じかどうか、など) と、jQueryがPHPを呼び出そうとしているところのコードを再確認ないし提示していただけますか。

投稿2019/05/01 22:39

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimon

2019/05/02 01:08 編集

どうもありがとうございます。2つご返信させてください。まず、 >jQueryがPHPを呼び出そうとしているところのコード というのはなくて、jqueryではcookieが保存されるだけです。(わかりにくくてすみません。) そしてphpで、jqueryで保存したcookieを呼び出すという感じで、それを目的としてる(つもりの)コードが質問にあるこちらの部分です。 ↓ $arr = isset($_COOKIE['save']) ? $_COOKIE['save'] : [];
marimon

2019/05/01 23:27

次に、どうして上のphpでcookieが呼び出せないかなと考えたところ、ひょっとしたらcookieの保存値がおかしいのではないかと思いました。 cookie('save')への保存値は、このような形になるハズですよね? ↓ [{"hoge":"hoge","fuga":"fuga"}] でも上のようになっていなくて、なぜか%がたくさん入っているこのような形でした。 ↓ %5B%7B%22hoge%22%3A%22hoge%22%2C%22fuga%22%3A%22fuga%22%7D%5D ひょっとして、phpの前にそもそもこの保存値がおかしいでしょうか? クロスドメインでもないので、jqueryによるこの保存値がおかしいのかもって思いました。
m.ts10806

2019/05/02 00:52

phpからJavaScriptはどう足掻いても呼び出せませんよ。だから話が通じてないわけですね。 サーバーサイドとクライアントサイドの関係性を一度整理してください。 なお追加の情報はコメントで返すのではなく原則質問を編集して追記してください。
marimon

2019/05/02 01:04

javascriptは呼び出しません。cookieの呼び出しです。
m.ts10806

2019/05/02 02:17

ああ、編集されたんですね。 ただ、結局、phpをどこからどう実行するのかがないとなんとも言えないですね。JavaScriptで保存した前提だとフォーム送信か、ajaxでしょうか。
marimon

2019/05/02 02:52

質問の編集前から、そしてあなたへの返信でもずっとそう書いています。mts10806さんはもう、あの、大丈夫なので。推測できる方々がこうしてご回答くださっているので。
m.ts10806

2019/05/02 03:06

「phpからjQueryを呼び出す」って書かれてましたよ。 まあ、手元に何かしらで呼び出したphpからJavaScriptで保存したCookieを呼び出したコードはあるのですが、どうも(考え方が間違ってることを指摘されたのに気づかれないまま)不要と言われたので仕方ないですね。 推測が必要な質問って、より具体的に書くことが推奨されるteratailでは非推奨ですよ。
marimon

2019/05/02 06:34 編集

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問