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

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

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

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

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

833閲覧

fetch APIで取得した値を、自作関数で返したい

hima-mura.

総合スコア42

PHP

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

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2022/07/07 09:35

編集2022/07/07 12:41
// sample.php <?php $a_name= $_POST['a_name']; $b_name= $_POST['b_name']; $c_name= $_POST['c_name']; $name_list=array('a_name'=>$a_name,'b_name'=>$b_name,'$c_name'=>$c_name); echo json_encode($name_list); ?> // sample.js function get_data(a_name,b_name,c_name){ const postData = new FormData; // フォーム方式で送る場合 postData.set('a_name', a_name); postData.set('b_name', b_name); postData.set('c_name',c_name); const data = { method: 'POST', body: postData, }; fetch(sample.php, data) .then(response=> { return response.json(); }) .then(res=> { alert('x:'+res.a_name); return res_name; }) .catch(error=> { alert(error); }) alert('y'); return response.json(); // ここにPHPから返された値を指定したい } var info= get_data('a','b','c'); alert('----'); alert(info); // get_data()を処理してから個々のコード(alert(info))を処理したい alert('last'); // alertの結果 y x:a (以降何も表示されない) // 理想 y x:a ---- Object last

やりたいことは、自作関数get_dataの返り値にfetchAPIで取得した値(形式:json)を指定したいです。そのうえで、コールバックであるget_data()を処理してからalert(info)を処理したです。
関数の一番上に変数を用意して、(then(response=> {〇 return response.json();}))の〇の部分に、用意した変数にresponse.json()を代入したり、リストで追加したりして、それを関数の返り値に指定しましたが、用意したときの値のままでした。
助言をお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

//sample.php

PHP

1<?php 2header('Content-Type: application/json'); 3$name_list["a_name"]= filter_input(INPUT_POST,'a_name'); 4$name_list["b_name"]= filter_input(INPUT_POST,'b_name'); 5$name_list["c_name"]= filter_input(INPUT_POST,'c_name'); 6echo json_encode($name_list);

//js

javascript

1const get_data=async(a_name,b_name,c_name)=>{ 2 const url="sample.php"; 3 const body = new FormData; 4 body.append('a_name', a_name); 5 body.append('b_name', b_name); 6 body.append('c_name',c_name); 7 const method="post"; 8 const option = { method,body}; 9 const data=await fetch(url, option).then(res=>res.json()); 10 alert('x:'+data.a_name); 11 alert('y'); 12 return data; 13} 14(async()=>{ 15 var info= await get_data('a','b','c'); 16 alert('----'); 17 alert(JSON.stringify(info)); 18})(); 19

投稿2022/07/07 10:21

yambejp

総合スコア114843

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

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

hima-mura.

2022/07/07 12:35

返信ありがとうございます。 上記のコードで問題なく動くのですが、変数infoを外で使用できません。やりたいこととしましては、 (async()=>{ var info= await get_data('a','b','c'); alert('----'); alert(JSON.stringify(info)); })(); alert(info); // ここでinfoを使用したいが先に(alert(info))が処理され次に(await get_data('a','b','c');)が処理されるのが問題 コールバックの処理が終了してから、次のコード(今回はalert(info))を実行したいです。 そもそもの考え方が間違いなのでしょうか。助言をお願いいます。
退会済みユーザー

退会済みユーザー

2022/07/08 00:08

関数の外でlet info;しておけば、var を省いて info= await get_data('a','b','c'); で行けそうな気がするけれど。
yambejp

2022/07/08 00:22

> 外で使用できません 中でやればいいだけのはなしでしょ? 中でinfoを確認すのが「alert(JSON.stringify(info));」なんですけどね ようはこういうことなので、もはや外に出す意味はありません window.addEventListener('DOMContentLoaded',async ()=>{ info= await get_data('a','b','c'); alert('----'); await alert(JSON.stringify(info)); });
hima-mura.

2022/07/09 04:10

sPy2bUDOZ4uRa7tさんのご指摘通り外で定義した変数にawait get_data('a','b','c');の値を入れて、すこし条件をつけてできました。await get_data('a','b','c');の値をグローバルスコープで使いたかったので、このような希望になってしまいました。 ありがとうございました。
guest

0

POSTメソッドでFetch APIを使うなら、正しいやり方を踏まえてください。
Fetch の使用 - Web API | MDNの「リクエストオプションの適用」にて、
POSTメソッドでの送信例があります。
'Content-Type': 'application/x-www-form-urlencoded',で送信するならオブジェクトのまま、
'Content-Type': 'application/json',で送信するならJSONにエンコードすることになります。
FormData オブジェクトにする必要、あるかなぁ。XHRじゃないので、もっと簡単に行きそうな気もするけれど。
php側で受信できていればそれで良しってことで。。

あとphp側、
header('Content-Type: application/json');
を加えておくと良さげ。
余計なデバッグ出力や空の改行など出力させないように。

投稿2022/07/07 09:46

編集2022/07/07 09:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hima-mura.

2022/07/07 11:40

返信ありがとうございます。 表記していませんが、実際はテンプレートエンジンを使っている関係でjs側でjson形式を定義するを避ける形でformDataオブで送信しています。その際に'Contet-Type'は指定すべきということでしょうか?この文がなくても送受信できているようで気が付きませんでした。一通り「リクエストオプションの適用」に目を通し、自分でも調べてみたのですが、指定する利点とは何でしょうか?また、今回の場合は、multipart/form-data を指定であっていますか?
退会済みユーザー

退会済みユーザー

2022/07/07 23:58

指定しなければ 'Content-Type': 'application/x-www-form-urlencoded', で進むはずなので、POSTとして受信できるはずですが。兎にも角にもphp側でvar_dump()/var_export()などして受信できていればOKってことで。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問