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

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

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

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

Q&A

解決済

2回答

1340閲覧

ajaxで自分自身にpostしたい

ratezou

総合スコア62

Ajax

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

0グッド

0クリップ

投稿2023/01/02 00:12

サイト作成の勉強中です。

PHPでformをsubmitしてDBを更新するサイトを作成していました。
ただ、これだと、戻るボタンで更新前の画面に戻ってしまいます。
DBを更新するサイトを呼び出したサイトに戻したいと思い、ajaxを使ってPOSTしたらどうなるのだろうと思い、挑戦していました。
しかし、jsでPOSTのロジックには入っているものの、PHPの更新部分には入っていないようです。どこがいけないのでしょうか?

具体的には以下のプログラムで、
click
done
とconsoleに表示されますが、
POSTとはvar_dumpされません。

index.php

1<?php 2 3ini_set('display_errors', 1 ); 4error_reporting(E_ALL); 5 6require_once(__DIR__ . "/../../app/config.php"); 7 8createToken(); 9 10$pdo = getPdoInstance(); 11 12if ($_SERVER['REQUEST_METHOD'] === 'POST') { 13 var_dump("POST"); 14 15 validateToken(); 16 $action = filter_input(INPUT_POST, 'mode'); 17 18 switch ($action) { 19 case 'save': 20 saveBundle($pdo); 21 break; 22 case 'done': 23 doneBundle($pdo); 24 break; 25 } 26} 27 28$bundle = getBundle($pdo); 29 30?> 31<!DOCTYPE html> 32<html lang="ja"> 33<head> 34 <meta charset="UTF-8"> 35 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 36 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 37 <title>Tools</title> 38 <meta http-equiv="Content-Style-Type" content="text/css"> 39 <link rel="stylesheet" href="css/styles.css"> 40</head> 41<body> 42<main> 43 <input type="button" onclick="location.href='../index.php'" value="<<"> 44 <h1>2F 食堂</h1> 45 <ul> 46 <li class="comment"><label for="f2a4">A4</label><input class="bundle" type="number" name="f2a4" onFocus="this.select();" value=<?= h($bundle->f2a4); ?>><span class="comment_content">未開封2束<span></li> 47 <li><label for="f2a3">A3</label><input class="bundle" type="number" name="f2a3" onFocus="this.select();" value=<?= h($bundle->f2a3); ?>></li> 48 <li><label for="f2b5">B5</label><input class="bundle" type="number" name="f2b5" onFocus="this.select();" value=<?= h($bundle->f2b5); ?>></li> 49 <li><label for="f2b4">B4</label><input class="bundle" type="number" name="f2b4" onFocus="this.select();" value=<?= h($bundle->f2b4); ?>></li> 50 </ul> 51 <h1>3F 会議室</h1> 52 <ul> 53 <li><label for="f3a4">A4</label><input class="bundle" type="number" name="f3a4" onFocus="this.select();" value=<?= h($bundle->f3a4); ?>></li> 54 <li><label for="f3a3">A3</label><input class="bundle" type="number" name="f3a3" onFocus="this.select();" value=<?= h($bundle->f3a3); ?>></li> 55 <li><label for="f3b5">B5</label><input class="bundle" type="number" name="f3b5" onFocus="this.select();" value=<?= h($bundle->f3b5); ?>></li> 56 <li><label for="f3b4">B4</label><input class="bundle" type="number" name="f3b4" onFocus="this.select();" value=<?= h($bundle->f3b4); ?>></li> 57 </ul> 58 <button id="save">save</button> 59 <button id="done">done</button> 60 <input type="hidden" name="token" value="<?= h($_SESSION['token']); ?>"> 61</main> 62</body> 63<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script> 64<script> 65 $(function(){ 66 $("#save").on("click", function(event){ 67 console.log("click"); 68 $.ajax({ 69 type: "POST", 70 url: "", 71 data: { "mode" : 'save' } 72 }).done(function(data){ 73 console.log("done"); 74 }).fail(function(XMLHttpRequest, status, e){ 75 console.log("fail"); 76 }); 77 }); 78 }); 79</script> 80</html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

ブラウザでindex.phpを表示した時にどんな動作をするか「最初から順番に」考えればいい。

1 「ブラウザからindex.phpにGETリクエストが送られた」らPHPによってindex.phpからhtmlが作られて出力される。最近のteratailの初心者を見てるとここの認識が完全に抜けてる。「最終的に出力されるのはhtml」なのに自分の書いたPHPコードだけを必死に見ても意味がない。見るべきなのは出力されたhtml。この時のhtmlはブラウザが受け取って表示。

2 JSが動くのはブラウザがhtmlを表示した後。jsからpostしたら「jsによってindex.phpにpostリクエストが送られた」ということ。また最初からindex.phpが処理される。postなのでif ($_SERVER['REQUEST_METHOD'] === 'POST')を通ってvar_dump("POST")が出力されてその後のhtmlも出力される。この時のhtmlを受け取ってるのはjs。jsが受け取ったのでこの出力はdone(function(data)dataに入っている。

3 2回目のindex.phpの処理はhtmlを出力した時点で終わり。1回目のindex.phpが出力したhtmlのjsのdone()に戻る。ここでconsole.log("done")なのでdoneだけ表示。var_dump("POST")が含まれるdataは何もしてないので当然表示されない。

投稿2023/01/02 01:12

kawax

総合スコア10377

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

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

ratezou

2023/01/02 01:25

2のところ、全然理解できてませんでした。 if ($_SERVER["REQUEST_METHOD"] === "POST") { var_dump("POST"); // validateToken(); // $action = filter_input(INPUT_POST, "mode"); // switch ($action) { // case "save": // saveBundle($pdo); // break; // case "done": // doneBundle($pdo); // break; // } exit; } に変更したら、 dataに string(4) "POST" が入ってました。 POST部分を少しづつ進めてみようと思います。
ratezou

2023/01/02 01:50

ajaxのPOSTで渡すdataが全く足りていないため、PHP側で参照した時にエラーになっていました。 PHPが参照する値をすべて渡したところ、思い通りの動作になりました。 何度更新しても、戻るボタン一回でメニューに戻れました。 アドバイスありがとうございます。
guest

0

どのように確認されたのか分からないですが、
Ajaxのコールバックで返ってきている情報を何もコンソール出力してないのはよろしくないかと。
そこに問題解決につながるヒント(具体的なエラーや起きていることなど、レスポンス)が入っているのは間違いないです。
俗に「例外を握りつぶす」ようなこともされています。
開発段階であればどこかしらに出力しましょう。
JavaScriptならコンソール出力、PHP側もログ出力の仕組みは必要です。

投稿2023/01/02 01:01

m.ts10806

総合スコア80850

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

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

ratezou

2023/01/02 01:14

doneの箇所を }).done(function(data, textStatus, jqXHR){ console.log(data); console.log(textStatus); console.log(jqXHR); としたところ、 dataが、 string(4) "POST" Invalid post request textStatusが、 success jqXHRが、 {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …} abort : ƒ (e) always : ƒ () catch : ƒ (e) done : ƒ () fail : ƒ () getAllResponseHeaders : ƒ () getResponseHeader : ƒ (e) overrideMimeType : ƒ (e) pipe : ƒ () progress : ƒ () promise : ƒ (e) readyState : 4 responseText : "string(4) \"POST\"\nInvalid post request" setRequestHeader : ƒ (e,t) state : ƒ () status : 200 statusCode : ƒ (e) statusText : "OK" then : ƒ (t,n,r) [[Prototype]] : Object と返ってきていました。 Invalid post requestということは、そもそもが間違っているのでしょうね。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問