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

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

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

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

JavaScript

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

Q&A

解決済

3回答

3047閲覧

Javascriptでfetchがうまく動いてくれません。アドバイスいただけないでしょうか。

bellevue

総合スコア16

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2020/01/20 15:06

編集2020/01/21 06:38

Javascriptでfetchがうまく動いてくれません。アドバイスいただけないでしょうか。

ローカルのサーバー(php.7.2.24)では動いているのですが、xserverの環境(php.7.2.17)では動いてくれないので、困っております。なお、phpの環境の違いが原因であると断定しているわけではありません。ローカルでは動いてくれるのに、xサーバーにアップしたら動かなくなったというだけです。

phpの側でファイル書き出しする方は確実に動いており、copydata.jsonは正しく出力されているようです。

ですが、javascriptのexecPasteで読み込んだ
document.getElementById(pre1id).value = json.CT_Code;
に対して
TypeError: document.getElementById(...) is null
というエラーが出て、おかしな値がセットされてしまいます。

phpでファイル書き出しするもの

php

1$obj = '{ "CT_Code": "' . $CT_Code . '", "CT_Item": "' . $CT_Item . '", "CT_Kikan": "' . $CT_Kikan . '", "CT_Email": "' . $CT_Email . '" }'; 2$data = json_decode($obj, true); 3 4$filename = 'copydata.json'; 5$somecontent = $obj; 6if (is_writable($filename)=== FALSE) { 7echo "the file is not writable"; 8} 9$json = fopen('copydata.json', 'w'); 10if ( fwrite($json, json_encode($data)) === FALSE) { 11echo "Cannot write to file ($filename)"; 12exit; 13}

Javascriptで読み込むもの

Javascript

1$("#execPaste").click(function () { 2var pre1id = localStorage.getItem('pre1id'); //Storageから 1つ前のフォーカス位置のid読み込み 3var pre2id = localStorage.getItem('pre2id'); //Storageから 2つ前のフォーカス位置のid読み込み 4var pre3id = localStorage.getItem('pre3id'); //Storageから 3つ前のフォーカス位置のid読み込み 5result = pre1id.indexOf("Code"); 6if (result != -1) { 7 pre2id = pre1id.substr(0, result); 8 pre3id = pre1id.substr(0, result) + "MailAddress"; 9} 10 11fetch("copydata.json") 12 .then(response => response.json()) 13 .then(function (json) { 14 document.getElementById(pre1id).value = json.CT_Code; 15 document.getElementById(pre2id).value = json.CT_Item; 16 document.getElementById(pre3id).value = json.CT_Email; 17 }); 18});

1月21日追記します。
以下のようにコンソール出力をさせました。

javascript

1fetch("./copydata.json") 2 .then(response => response.json()) 3 .then(function (json) { 4 console.log(json); 5 document.getElementById(pre1id).value = json.CT_Code; 6 document.getElementById(pre2id).value = json.CT_Item; 7 document.getElementById(pre3id).value = json.CT_Email; 8 });

すると、コンソールには、以下のように書き出されます。

Object { CT_Code: "00029302008", CT_Item: "xxxxxxxxxxxxxxxx", CT_Kikan: "", CT_Email: "" }

これで実は期待どおりに動くのです。
ですが、phpの方でcopydata.jsonが書き換えられても、2回目以降のjavascriptでは、新しいcopydata.jsonの内容が反映されず、最初のデータのままなのです。そして、2回目以降は、

Object { CT_Code: "00029302008", CT_Item: "xxxxxxxxxxxxxxxx", CT_Kikan: "", CT_Email: "" }
TypeError: document.getElementById(...) is null

となります。

ちなみに、

javascript

1$.getJSON("copydata.json", function (data) { 2 //読み込んだdataに対する処理 3 console.log(data); 4 document.getElementById(pre1id).value = data.CT_Code; 5 document.getElementById(pre2id).value = data.CT_Item; 6 document.getElementById(pre3id).value = data.CT_Email; 7});

というものも試しています。
1回目のcopydata.jsonのデータが反映され、エラーメッセージも全く同じ結果になります。

さらに追記します。
2回目のcopydata.jsonが反映されないので、キャッシュを読み込んでいるのかと疑い、キャッシュさせないようにするのと、ctrl+shift+rなどを試してみましたが、依然として最初のcopydata.jsonが反映されるようです。原因が違うのかもしれません。

さらに追記します。
xserverにもキャッシュ設定というものがあるということを発見したのですが、それもoffであることを確認しています。
社内LANのサーバーにアクセスして実行するときちんと動きます。ブラウザをそのまま閉じることなく、別のタブにしてxserverにアクセスすると、とたんに動かなくなります。行ったり来たりしても、社内LANでは動き、xserverでは動きません。
気にかけていただいた方、ありがとうございました。
初心者なので、情報提供もこの程度しか出来ません。

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

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

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

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

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

dameo

2020/01/20 21:26

https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch 「fetch() から返される Promise は レスポンスが HTTP 404 や 500 を返して HTTP エラーステータスの場合でも拒否されません。代わりに (ok ステータスが false にセットされて) 正常に解決し、拒否されるのはネットワークのエラーや、何かがリクエストの完了を妨げた場合のみです。」 とあります。 大丈夫でしょうか? というか、うまく動かないときは他人に聞く前に受け取ったデータを「全て」見てください。 最近のブラウザならネットワークのモニタリングも出来るので、どちらが悪いかは一目瞭然なはずなのに、そのデータがありません。
m.ts10806

2020/01/20 23:56

htmlと、localstorageに書き込むところもご提示ください。 あとresponse後のjsonという変数には想定の情報は入っているのでしょうか。コンソール出力してご確認ください。
bellevue

2020/01/21 01:27

ご指導ありがとうございます。こういったものを開発し始めてから半年ほどなので、dameoさんが教えてくださっているようなこと自体もまだ分かりません。申し訳ありません。localStorageに書き込むところ、追記してみます。jsonの内容について、追記しますので、お時間ありましたら、また見てください。
dameo

2020/01/21 06:00

(1)よく分からないものを分からないまま使ってはいけません (2)プログラムは全部書いてから間違っていることを少しずつ見つけて直す、のではなく、間違ってないことが分かっている部分を少しずつ増やすような形で書き進めてみてください。そうしないと全てを疑わないといけない分、問題に気付きにくくなり、バグだらけになってしまいます。 (3)恐らくChromeデベロッパーツールを使ってるということであれば、それを使いこなしてください。ググればデバッグの方法が分かります。phpも比較的手順が多めですが、デバッグ環境を構築できます。 (4)ネットワークで通信するようなケースでは、ブラウザのネットワークのモニタリングも効果的です。今回はHTTP(HTTPS)だと思うので、その知識さえあればより効率的に問題を発見できます。 (5)今回は違うと思いますが、タイミングに依存して稀に発生する再現性のない問題というのもありますが、そういうものは(コンソール以外にも)大量にログなどを出力することで追いかけることもあります。 自分で気付けないことは他人に聞くと早い事が多いですが、そもそも自分に「端折ってる」部分がある場合、そこが原因であることも多いです。まずはそこを疑いましょう。欲張らずに一歩一歩丁寧に進めてみてください。
dameo

2020/01/21 06:15

あと、キャッシュを疑っているようですが、ネットワークモニタリングしてればキャッシュを使ってるかどうかも一目瞭然ですし、デベロッパーツールでキャッシュをdisableしておくことも出来ます。ただ、今回のように鯖側もいじれるケースではそもそもキャッシュの制御も自分の責任なので、効果的な設定にしておく必要があります。ただし主にその辺が問題になるのは、本番環境でのjavascriptやcssなどで、開発環境ではキャッシュ自体しないようにしておくのが一般的です。
dameo

2020/01/21 07:03

「初心者なので、情報提供もこの程度しか出来ません。」はダメですよ。 また「環境が変わった程度で動かなくなり、その原因も分からない」は、プログラムのバグです。 現時点ではデバッグもネットワークモニタリングも出来ないのに異常系の実装が全くないのが一番の問題です。そして、私は、『うまく動かないときは他人に聞く前に受け取ったデータを「全て」見てください。』と言いました。全て見ていますか?
dameo

2020/01/21 07:20

時間がないので、もう書いときます。 <script> fetch("./copydata.json") .then(response => { console.log(response); return response.json(); }) .then(function (json) { console.log(json); }); </script>
guest

回答3

0

xserverで運用すると、キャッシュされてしまい、最新のcopydata.jsonが反映されませんでした。
見よう見まねで申し訳ありませんが、以下のように明示的にno-cacheを入れることで解消できました。

javascript

1 fetch("./copydata.json",{ 2 method: "POST", // *GET, POST, PUT, DELETE, etc. 3 mode: "cors", // no-cors, cors, *same-origin 4 cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached 5 credentials: "same-origin", // include, same-origin, *omit 6 headers: { 7 "Content-Type": "application/json; charset=utf-8", 8 // "Content-Type": "application/x-www-form-urlencoded", 9 }, 10 redirect: "follow", // manual, *follow, error 11 referrer: "no-referrer" // no-referrer, *client 12 }) 13 .then(response => { 14 console.log(response); 15 return response.json(); 16 }) 17 .then(function (json) { 18 console.log(json); 19 document.getElementById(pre1id).value = json.CT_Code; 20 document.getElementById(pre2id).value = json.CT_Item; 21 document.getElementById(pre3id).value = json.CT_Email; 22 });

投稿2020/01/27 13:49

bellevue

総合スコア16

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

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

0

自己解決

解決しました。気にかけていただけた方、ありがとうございました。

javascript

1document.getElementById(pre1id).value = response.json.CT_Code; 2document.getElementById(pre2id).value = response.json.CT_Item; 3if (resultall != -1) { 4 document.getElementById(pre3id).value = response.json.CT_Email 5}

実は、CT_Emailというのは、テーブル内のフィールドとして存在する場合と存在しない場合があります。あってもなくても代入する処理をしておりました。それでも、社内のサーバーは残りの処理をしてくれていました。ですが、エックスサーバーは無いはずのフィールドにデータを入れようとする処理が存在すると、動いてくれないようでした。
また、最初に読み込んだものしか反映されないということは、バッファを疑いましたが、バッファの問題ではなく、同じ原因を引き金として、読み込まないということでした。
対策として、フィールドがないとき(resultall != -1)には、代入させないように処理を分けてやることで、全体が正常に動きました。
dameoさん、いろいろありがとうございました。プログラマーの仕事は私の仕事のなかの1%にもみたないごくわずかな部分です。大事ではあるのですがなかなかきちんとした勉強はできません。おっしゃることはもっともだと思いますので、少しずつですが、正道を目指していこうと思います。

投稿2020/01/22 04:06

bellevue

総合スコア16

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

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

0

localstorageから読み出さずに、スタティックにhtml上のidを
指定して動くことを確認してください。
それで問題ないならlocalstrageへの投入がただしく行われていないということです

投稿2020/01/21 00:28

yambejp

総合スコア114839

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

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

yambejp

2020/01/21 00:30

copydata.jsonをphpで書いているのと、 jsで同ファイルを指定しているのは直接的になんの関係もありません。 今回の件はphpは忘れて問題ないでしょう
bellevue

2020/01/21 01:33

ご指導ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問