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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

JavaScript

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

Q&A

解決済

2回答

2303閲覧

Fetch APIを使ったPOST送信で、配列データがPHP側で変換できない。

Anon_

総合スコア334

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2021/08/04 02:42

Fetch APIを使って配列データをPOST送信したいのですが、PHP側で配列データを受け取ることができません。
JSON.stringifyでjson化しているのですが、どこか間違っている個所はありますでしょうか。

JS

1 2//送信元 3// FetchAPIのオプション準備 4const ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>"; 5const params = new FormData(); 6params.append("import_data", JSON.stringify(import_data) ); 7const option = { 8 method: "POST", 9 credentials:"same-origin", 10 header: { 11 'Content-Type': 'application/json' 12 }, 13 //リクエストボディ 14 body: params, 15}; 16

PHP

1//受信側 2 3//$_POST['import_data']の中身 json_encodeをかけると中身が空になる。 4 5 [import_data] => [{\"会員No\":\"1001\",\"姓\":\"山”田\",\"名\":\"太郎\",\"姓フリガナ\":\"ヤマダ\",\"名フリガナ\":\"タロウ\",\"郵便番号\":\"9190000\",\"国\":\"JP\",\"都道府県\":\"北海道\",\"市区郡町村\":\"札幌市\",\"番地\":\"222\",\"ビル名\":\"\",\"電話番号\":\"\",\"FAX番号\":\"\",\"Eメール\":\"test@example.com\",\"入会日\":\"2021-08-02 17:36\",\"ランク\":\"0\",\"保有PT\":\"0\"},{\"会員No\":\"1000\",\"姓\":\"山田\",\"名\":\"太郎\",\"姓フリガナ\":\"ヤマダ\",\"名フリガナ\":\"タロウ\",\"郵便番号\":\"910-0000\",\"国\":\"JP\",\"都道府県\":\"北海道\",\"市区郡町村\":\"札幌市\",\"番地\":\"111\",\"ビル名\":\"\",\"電話番号\":\"\",\"FAX番号\":\"\",\"Eメール\":\"test2@example.com\",\"入会日\":\"2021-08-02 17:34\",\"ランク\":\"0\",\"保有PT\":\"0\"}] 6

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

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

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

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

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

Anon_

2021/08/04 07:07

ものすごく関係ありそうです。 マジッククォートの存在を忘れていました。 確認してみます。
Anon_

2021/08/04 07:16

ビンゴのようです。またこの存在を忘れそうで怖いです・・汗 何度も助けていただき、本当にありがとうございます。
Anon_

2021/08/04 07:20 編集

次があればぜひ回答のほうにどうぞ。BAがつけられませんので。
Lhankor_Mhy

2021/08/04 08:17

ご解決されて何よりです。 ありがとうございます。お役に立てそうであれば、回答欄に記入させていただきます。
guest

回答2

0

$_POST['import_data']の中身 json_encodeをかけると中身が空になる。

json_decodeするのでは?

//sample.php

PHP

1<?PHP 2print_r( json_decode($_POST["import_data"],JSON_OBJECT_AS_ARRAY));

javascript

1const params=new FormData(); 2const import_data=[ 3 {"会員No":"1001","姓":"山田","名":"太郎","姓フリガナ":"ヤマダ","名フリガナ":"タロウ","郵便番号":"9190000","国":"JP","都道府県":"北海道","市区郡町村":"札幌市","番地":"222","ビル名":"","電話番号":"","FAX番号":"","Eメール":"test@example.com","入会日":"2021-08-02 17:36","ランク":"0","保有PT":"0"}, 4 {"会員No":"1000","姓":"山田","名":"太郎","姓フリガナ":"ヤマダ","名フリガナ":"タロウ","郵便番号":"910-0000","国":"JP","都道府県":"北海道","市区郡町村":"札幌市","番地":"111","ビル名":"","電話番号":"","FAX番号":"","Eメール":"test2@example.com","入会日":"2021-08-02 17:34","ランク":"0","保有PT":"0"} 5 ]; 6params.append("import_data",JSON.stringify(import_data)); 7const option = {method: "POST",body: params,}; 8fetch('sample.php',option).then(res=>res.text()).then(console.log);

投稿2021/08/04 03:00

yambejp

総合スコア114843

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

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

Anon_

2021/08/04 04:01

ごめんなさい。json_decodeすると空になると書いたつもりが記載できておりませんでした。
yambejp

2021/08/04 04:10

回答の通りテストして確認できませんか?
Anon_

2021/08/04 04:27 編集

json_decodeの第二引数は指定しておりませんでしたので、こちらを指定しましたが内容は変わりませんでした。 受け手では下記のように記述してログを確認しております。 my_log($_POST, '$_POST'); $import_data = json_decode($_POST["import_data"],JSON_OBJECT_AS_ARRAY); my_log($import_data, '$import_data');
Anon_

2021/08/04 04:15

$_POSTのログの中身は質問文に掲載した通りなのですが、json_decodeで空になっております。 タイポなどはないように思います。
yambejp

2021/08/04 04:24

modeとimport_dataの関係はなんなんでしょう? 私のソースをコピペで実行して動くのかどうかまずテストしてください
Anon_

2021/08/04 04:45

modeは不要でしたので削除しました。 import_dataをコピペして下記のコードを修正しましたが、結果は全く同じでした。 ログのデータを見ると、JSONを[]で囲われている事が原因でjson_decodeできないように思われるのですが、いかがでしょうか。 let test_data =[ {"会員No":"1001","姓":"山ああ田","名":"太郎","姓フリガナ":"ヤマダ","名フリガナ":"タロウ","郵便番号":"9190000","国":"JP","都道府県":"北海道","市区郡町村":"札幌市","番地":"222","ビル名":"","電話番号":"","FAX番号":"","Eメール":"test@example.com","入会日":"2021-08-02 17:36","ランク":"0","保有PT":"0"}, {"会員No":"1000","姓":"山田","名":"太郎","姓フリガナ":"ヤマダ","名フリガナ":"タロウ","郵便番号":"910-0000","国":"JP","都道府県":"北海道","市区郡町村":"札幌市","番地":"111","ビル名":"","電話番号":"","FAX番号":"","Eメール":"test2@example.com","入会日":"2021-08-02 17:34","ランク":"0","保有PT":"0"} ]; params.append("import_data", JSON.stringify(test_data) ); const option = { method: "POST", //リクエストボディ body: params, };
yambejp

2021/08/04 04:54

動作確認のためもっと簡易的なデータでチェックすることをおすすめします。 例示のtest_dataなら間違いなくjsonデータとしてPHP側で受け取れます
Anon_

2021/08/04 05:06

import_dataのデータを減らしても同様の結果でした。 PHP側で受け取ったPOSTのdecode前のデータが[]で囲われている点については何かわからないでしょうか。 多分これがネックになっていると思うのですが。
yambejp

2021/08/04 05:13

> POSTのdecode前のデータが[]で囲われている点については何かわからないでしょうか。 なんの問題もありません print_rで出力したテキストをテキストとして確認するのは 理解していますか?
yambejp

2021/08/04 05:21

根本的なところで勘違いしていませんか? PHPからJSONデータを返してほしいなら <?PHP echo $_POST["import_data"]; で十分ですよ?
Anon_

2021/08/04 05:27

$_POST["import_data"]の中身が [{\"会員No\":\"1001\"},{\"会員No\":\"1000\"}] 勘違いはしてないと思うのですが、上記のデータを受け取ってそれをPHPの連想配列の形に戻して処理をしたいのですが、その場合にjson_decode()を使用する手順は何か間違っているのでしょうか。。
yambejp

2021/08/04 05:39

再度確認、以下一言一句変えずにコピペしてコンソールに何が表示されますか? //sample.php <?PHP print $_POST["import_data"]; ?> //script <script> let test_data =[ {"会員No":"1001"}, {"会員No":"1000"} ]; const url="sample.php"; const body=new FormData(); body.append("import_data", JSON.stringify(test_data)); fetch(url,{body,method:"post"}).then(res=>res.text()).then(console.log); </script>
yambejp

2021/08/04 05:42

コンソールに [{"会員No":"1001"},{"会員No":"1000"}] と表示されるなら正しいですが "[{\"会員No\":\"1001\"},{\"会員No\":\"1000\"}]" と表示されるなら何らかの理由で二重にエンコードされていると思います
Anon_

2021/08/04 05:54

WordPress上でのPOSTなので、上記のコードは一言一句変えずにというのが実質できません。 試しに JSON.stringify()を外してみたところ、下記のように取得されます。 これは正しい挙動だと思います。 【$_POST】Array ( [import_data] => [object Object],[object Object] )
yambejp

2021/08/04 06:11

print $_POST["import_data"]; をお願いしているのにArray(・・・)が変えるはずがありません 質問者さんが勝手に何か手を加えている部分が 悪影響していると思います。
Anon_

2021/08/04 06:21

本当に何も手は加えてないですよ。 リファラチェックと処理に入る前のmodeは受け取っていますが、json_decodeとは無関係だったのであえて記載はしていませんでした。 check_ajax_referer('action', 'nonce'); //無視 $mode = isset($_POST['mode']) ? $_POST['mode']: ''; //無視 print_r($_POST['import_data']); return; 上記のようにprint_rしたところ、fetchのcatchにて下記エラーがでました。 SyntaxError: Unexpected token \ in JSON at position 2
Anon_

2021/08/04 07:21

別の方の指摘で解決できました。 色々コメントいただきありがとうございました。
guest

0

自己解決

https://stray-light.info/wp/magic_quotes_gpc/

マジッククォートが原因でバックスラッシュが挿入されていたようです。

$import_data = $_POST['import_data '] ?? ''; if($import_data){ $import_data = is_array($_POST['import_data ']) ? array_map('stripslashes_deep', $_POST['import_data ']) : stripslashes($_POST); $decode_import_data= json_decode($import_data, true); /* 【$decode_import_dataの中身】 Array ( [0] => Array ( [会員No] => 1001 ) [1] => Array ( [会員No] => 1000 ) */ }

投稿2021/08/04 07:19

編集2021/08/04 07:33
Anon_

総合スコア334

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

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

yambejp

2021/08/04 08:10

ごくろうさま、今後環境依存のものは事前に調べて質問下さい
Anon_

2021/08/04 08:47

そこに気づけるならそもそも質問してないと思います^^; 何度も$_POSTの中身とコードは提示しているので、そこを責めだしたら誰も質問できないですよ笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問