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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1125閲覧

POST通信でファイル書き込みに成功するが、失敗時分岐のテキストが表示される(成功時テキストが出力されない

webserviceNI

総合スコア39

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2021/12/30 23:37

編集2021/12/31 00:36

こちらのサイト
https://joyplot.com/documents/js-xmlhttprequest-post/

を参考に、POSTでデータを送信→受信側でテキストデータに書き込む処理を、
XMLHttpRequestを使用しならが実装しています。

いま、main.phpとtest.phpがあり、
main.phpからPOSTでデータを送り、sub.phpで受け取っています。

(送信データ)

var postData = { "name": "名無しさん", "text": "This is a test!(" + new Date().toLocaleTimeString() + ")" };

上記を「name=名無しさん&text=This is a test!(8:30:34)」の形に整形済み(サイト参照

(sub.php)

<?php // print_r($_POST); $ok = array( 'OK', 'です'); $err = array( 'エラー', 'です'); function console_log($data){ echo '<script>'; echo 'console.log('.json_encode($data).')'; echo '</script>'; } $name = $_POST['name']; echo $name; console_log($name); if (!empty($_POST['name']) && !empty($_POST['text'])) { echo "OK <br/>"; console_log($ok); $name = $_POST['name']; $text = $_POST['text']; // POSTで送信されたデータを書き込む $filename = 'text.txt'; $fp = fopen($filename, 'a'); fwrite($fp, $name . ' : ' . $text . PHP_EOL); fclose($fp); } else { echo "エラー <br/>"; console_log($err); } ?>

Firefoxの開発ツールのコンソールとEchoを利用してデバッグしています。
if文の中身が書き込み処理で、以外はだいたいデバッグテキストです。

sub.phpでデータを受け取ったところ、無事にファイルへの書き込みが行われています。
(main.php上でPOSTを行うたびに、ファイルが正常に追加書き込みされている)

ただ奇妙なことに、デバッグテキストで「else」文の中のエラーが毎回表示され、OKが表示されません。
POSTの中身を確認しても、nullとなっています(sub.phpのif文の前のecho)
Javascriptのコンソールでも同様です。

こちらなにが考えられますでしょうか。
デバッグの方法が悪いのでしょうか。

よろしくお願いいたします。

ーー追記ーー
main.phpのJavascriptの部分です。

// POSTで送信するデータ var postData = { "name": "名無しさん", "text": "This is a test!(" + new Date().toLocaleTimeString() + ")" }; var xhr = new XMLHttpRequest(); xhr.open("POST", "sub.php", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { // 送信に成功した時の処理 console.log(this.statusText); } else { console.log( "エラーです" ); } } var sendParam = ""; for (var name in postData) { if (sendParam === "") { sendParam = name + "=" + postData[name]; } else { sendParam += "&" + name + "=" + postData[name]; } } xhr.send(sendParam);

これを関数としてwindow.confirmかonclickイベントで実行させます。

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

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

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

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

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

m.ts10806

2021/12/31 00:20

そもそも、非同期通信の返却値でJavaScript実行しようとしてること自体間違いなのですが(画面がないので出来ない)、そのあたりは認識問題ないですか? 「出力全部」返ってくるので。 デバッグしたいならデバッガかログ出力するしかないです。
webserviceNI

2021/12/31 00:25

コメントありがとうございます。 >非同期通信の返却値でJavaScript実行しようとしてること自体間違い なるほど、、ブラウザでEchoを表示したタイミングは データ受信のタイミングとは違うということでしょうか。 >デバッグしたいならデバッガかログ出力するしかないです。 ログ出力というのは、テキストファイルなどとして出力するということですよね。 エラー自体は想定されるもので問題ないと理解しましたが大丈夫でしたでしょうか
webserviceNI

2021/12/31 00:27

ちょっと言葉足らずでした。 デバッグは上記の処理ではできない(処理が正しく行われているかどうかは確認できない) ということですね
m.ts10806

2021/12/31 00:28

>なるほど、、ブラウザでEchoを表示したタイミングは 非同期通信なのであれば「ブラウザで表示」ってないです。 バックグラウンドで実行されるので。 >エラー自体は想定されるもので問題ないと理解しましたが大丈夫でしたでしょうか ちょっとどこの何の話をしているのか分かりませんでした。
m.ts10806

2021/12/31 00:30

>デバッグは上記の処理ではできない(処理が正しく行われているかどうかは確認できない) 結局「非同期処理で何を処理させて何を返したいか」によると思います。 ファイル書き込みをしたい場合は「成否」のみを返すのが妥当かとは思いますが。 あと、JavaScript側のコードも提示してください。
webserviceNI

2021/12/31 00:36

sub.phpは記載していませんが、htmlとbodyもあり、 echoはボディ内で表示されるようにしています。 それでも表示はされないんですね(リロードして確認をしているので だからダメなのか? >>エラー自体は想定されるもので問題ないと理解しましたが大丈夫でしたでしょうか >ちょっとどこの何の話をしているのか分かりませんでした。 ファイル書き込みのタイミングと合わせてechoやコンソールで確認しようとした、 部分でした(ファイル書き込みではなく表示の部分 Javascriptはほとんど参考サイトそのままですが、、一応本文に追記しました
m.ts10806

2021/12/31 01:55

非同期で実行されるので「ブラウザから直接アクセス」というのはやってはいけません。ブラウザから直アクセスの場合はPOSTではなくGETです。 先に書いたように画面と言う概念を持たないのが非同期処理で「バックグラウンドで実行される」ので、どうしてもJavaScriptで確認したいならリクエストを送信したJavaScript側で返却値を受け取ることです。 なので、sub.phpのechoはjson_encode($data)のみにすることでしょうね。 他のechoはむしろ邪魔になっています。 結果を確認するのはmain.phpでリロード不要(バックグラウンド実行だから)。 console.log()でレスポンスを出力しているのでブラウザ開発ツールのコンソールを確認してください。
webserviceNI

2022/01/02 06:09

返信遅れてすいません。 >どうしてもJavaScriptで確認したいならリクエストを送信したJavaScript側で返却値を受け取ることです。 なるほど。main.phpでPOST送信に対する返却値で良いでしょうか。 XMLHttpRequestの返却処理を確認してみます。 ありがとうございますm(_ _)m
guest

回答1

0

自己解決

本質問、解決とさせてもらいます。
ありがとうございます。

投稿2022/01/11 01:22

webserviceNI

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問