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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

Q&A

5回答

14988閲覧

AjaxのPOSTがうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

0グッド

2クリップ

投稿2017/10/30 03:57

編集2017/10/30 06:32

php

1if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) 2 && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 3{ 4 if ($_POST['name']){ 5 $user->post(); 6 } 7};

javascript

1 $(document).ready(function() { 2 $('#comment_form').submit(function(e) { 3 e.preventDefault(); 4 var data = {id:$('#comment_thread_id').val() ,name:$('#comment_user_name').val() , text:$('#comment_text').val()}; 5 $.ajax({ 6 type: "POST", 7 url: "talk.php", 8 data: data, 9 }).done(function(data){ 10 console.log("ajax通信に成功しました"); 11 12 }).fail(function(XMLHttpRequest, textStatus, errorThrown){ 13 console.log("ajax通信に失敗しました"); 14 }) 15 return false; 16 }); 17 });

HTML

1<form id ="comment_form" action="talk.php" method="post"> 2 <input id="comment_thread_id" type="hidden" name="id" value="<?= $sledid;?>"> 3 <p>名前<input id="comment_user_name" type="text" name="username" value=""></p> 4 <p>本文<input id="comment_text" type="text" name="body" value=""></p> 5 <input type="submit" name="" value="挿入">

PHP

1public function post(){ 2 $sql = "insert into posts (post_id,name,body) values (:post_id,:name,:body)"; 3 $stmt = $this->_db->prepare($sql); 4 $stmt->bindParam(':post_id',$_POST['id']); 5 $stmt->bindParam(':name',$_POST['name']); 6 $stmt->bindParam(':body',$_POST['text']); 7 $stmt->execute(); 8}

ご覧いただきありがとうございます。
Ajaxに挑戦しているのですが、postされたデータが$_POST['id']しかpost()に反映されません。
御指摘ありましたら是非いただきたいです。

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

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

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

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

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

masaya_ohashi

2017/10/30 04:02

submitした際にページ遷移していませんか?
退会済みユーザー

退会済みユーザー

2017/10/30 04:04

確認しましたが、遷移しておりませんでした。
masaya_ohashi

2017/10/30 04:15

$.ajaxをする前にdataをログ出力したとき、正しく値は入っていますか?また、PHPで$_POSTをログ出力した時、どのような値が入っていますか?
退会済みユーザー

退会済みユーザー

2017/10/30 04:31

$_POSTをprint_rで出力しようとしましたが、何も出てきませんでした。他の出力方法はありますでしょうか?
masaya_ohashi

2017/10/30 04:34

お使いのフレームワーク等にログ出力機能はありませんか?
退会済みユーザー

退会済みユーザー

2017/10/30 04:37

var_dump($_POST);としたところ、usernameとtextの確認ができました。お手数おかけして申し訳ありません。
masaya_ohashi

2017/10/30 04:38

ちょっと待って下さい、var_dumpの結果はどこに表示されましたか?ブラウザの画面が切り替わって表示されましたか?それともajaxのレスポンスに返ってきていますか?
退会済みユーザー

退会済みユーザー

2017/10/30 04:44

phpの部分に、var_dump($_POST);を追加し、ページ更新たところ、画面上部に表示されました。しかし、その後何度かpostしてみましたが、$_POSTの中身が変わりません。
ooeok

2017/10/30 05:11

htmlとphpは同じファイル(talk.php)ですか?
退会済みユーザー

退会済みユーザー

2017/10/30 05:29

to ooeok様 同じファイルです
ooeok

2017/10/30 05:39

ありがとうございます。謎はすべてとけた!!それでformのpostでtalk.phpへ飛んでいたんですね。
masaya_ohashi

2017/10/30 05:43

画面遷移していないように見えて、同じ画面へ遷移しているので気付いていない、ということですね。実際は遷移しているので、ブラウザバックもできるはずです。リロードするときに「このままリロードを続けると同じリクエストを飛ばしちゃうけどいい?」みたいな警告がブラウザから出るかと思います。
退会済みユーザー

退会済みユーザー

2017/10/30 05:45

to masata_ohashi様 確かに更新時に警告が出てきていました。教えていただいた情報を元に再度コードを打ち直してみます
guest

回答5

0

ajaxで送信がうまくいった場合、画面の遷移(画面全体を再読み込みするような挙動)は起きません。しかし、$_POSTをvar_dumpして画面にusernameやbodyが表示されるという事実は「ajaxではなく普通にformとして送信した結果」であることを指しています。jqueryの.clickで書かれた処理は、その直後formのsubmitの実行により、おそらく途中でキャンセルされています。
formを利用してajax通信をする場合、必ず**本来のフォームの動作をキャンセルしなければいけません。**そのためにはEvent#preventDefaultを実行する必要があります。return falseだけではイベントのバブリングがキャンセルされるだけで、動作そのものがキャンセルされるわけではありません。
<form onSubmit="return false;">という書き方と混同されている可能性があります。こちらはreturn falseで本来の動作がキャンセルされます。

また、#send_commentのclickイベントをトリガーにしていますが、この場合usernameやbody内で「Enterを押して送信」した場合にajax通信でなく、formのsubmitが発生してしまうため、そもそもトリガーをformのsubmitで取るほうが良いです。

html

1<form id="form" action="" method="post"> <!-- formにidを振る -->

javascript

1$('#form').submit(function(e) { // formのsubmitに処理を登録する、引数としてEventのオブジェクトeを受け取る 2 e.preventDefault(); // これを一行目に追加

投稿2017/10/30 04:55

編集2017/10/30 04:58
masaya_ohashi

総合スコア9206

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

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

退会済みユーザー

退会済みユーザー

2017/10/30 06:39

質問内容のコードをご指摘いただいた通り打ち替え、色々と試みてはみたのですがやはり、$_POST['id']しかmysqlにinsertできませんでした。 consoleには確かにajax通信に成功しましたと表示されているのですが、、、 面倒であれば返信は結構です。知らないことがたくさんあり、いい勉強になりました。本当に感謝しています。
masaya_ohashi

2017/10/30 06:57

確認なのですが、DBのpostsテーブルのpost_idカラムにsledidだけが入っていて、nameとbodyは空のレコードが保存されていく、という認識で正しいですか?
masaya_ohashi

2017/10/30 06:59

postsテーブルにidというAUTO_INCREMENTなカラムがあって、そこだけが増えていく、という意味ではないですよね?$_POST['id']のデータがpost_idのカラムに入っているデータが増えていくんですよね?
退会済みユーザー

退会済みユーザー

2017/10/30 07:05

post_idはauto_incrementではないので、仰られている通り、$_POST['id']のデータがpost_idのカラムに入っていることは間違いありません。 ajaxでこの場合、id,name,textの3つの$_POSTがtalk.phpに送信?されていると思いますが、配列で送信されているのでしょうか? また関係しているかはわかりませんが、function post()はControll.phpという別ファイルから、require_onceで呼び出して、$user->post()と使用しているのですが、関係はありませんでしょうか?
masaya_ohashi

2017/10/30 07:21 編集

$_POST['id']が取れている以上、jQuery.ajaxで送信した連想配列はPHP側で正しく受け取れていると思います。試しにinsertするときにbindParamに渡している$_POST['name']と$_POST['text']の2つを何か適当な固定の文字列("山田太郎"とか"投稿文書"とかの文字列)に変えたとき、正しくinsertされるか試してみてもらえますか?
退会済みユーザー

退会済みユーザー

2017/10/30 07:30

id:$('#comment_thread_id').val() ,name:username ,text:usertext};で行なったところ、 コンソールにUncaught ReferenceError: text is not definedというふうに出てきました。 idはinsertされていませんでした
退会済みユーザー

退会済みユーザー

2017/10/30 07:32

name:"username"、text:"usertext"です。訂正します
退会済みユーザー

退会済みユーザー

2017/10/30 07:34

シングルクォートであれば、またしてもidのみinsertされています
masaya_ohashi

2017/10/30 07:39

jQuery側ではなくPHPのbindParamに渡している値を直接「固定の文字列」にしてくださいとお願いしたつもりです… $stmt->bindParam(':name',"山田太郎"); $stmt->bindParam(':text',"投稿文書");
退会済みユーザー

退会済みユーザー

2017/10/30 07:47

大変失礼いたしました。 試してみたところ、またしてもidのみのinsertでした。 ajaxではなくサーバー側の問題なのでしょうか?
退会済みユーザー

退会済みユーザー

2017/10/30 07:56

> $stmt->bindParam(':name',"山田太郎"); $stmt->bindParam(':text',"投稿文書"); ダメでしょ。。。 $tmp1 = 'hoge'; $tmp2 = 'piyo'; $stmt->bindParam(':post_id',$_POST['id']); $stmt->bindParam(':name',$tmp1); $stmt->bindParam(':body',$tmp2); さっさとエラーを表示するようにすればいいのに。。。
masaya_ohashi

2017/10/30 08:01

あ、そうでした。bindParamって変数を参照でバインドするんでしたね…直接文字列渡しちゃだめですね。 te2jiさんの指摘のやり方でテストしてみてください。 エラーについても指摘されているので、PHPのエラーログをあさってみてください。なにかWarning等が出ているかもしれません。
guest

0

ajax を使用した時のデバッグ方法覚えたほうがイイですよ。

ajax のデバッグは、「ブラウザの開発ツール」で request/response を確認し、不具合が発生しているときは、サーバサイドは notice も含めてエラー表示し、該当箇所を確認してみる事が重要です。

今回の件は、上記を行えば、問題箇所が大体特定できるはずです。

あと、質問内容とは直接関係はないですけど、ちゃんと入力値の確認と投稿元が自サイトであることの確認もしたほうが良いです。

投稿2017/10/30 04:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ajaxでpostする前にsubmitが効いてしまい、formの方でpostされちゃってるのではないでしょうか。
$_POSTをダンプしてみて下さい。
usernameとbodyが取れていたらそうです。

php

1var_dump($_POST);

投稿2017/10/30 04:31

ooeok

総合スコア469

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

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

退会済みユーザー

退会済みユーザー

2017/10/30 04:34

var_dump($_POST)を行なったところ、usernameとbodyを確認できました。 画面の遷移は確認できないのですが、どの様な現象?が起きてしまっているのでしょうか? 大雑把な質問で申し訳ありません。
masaya_ohashi

2017/10/30 04:37

なん…だと…? 画面遷移は発生していないのではなかったのですか?var_dumpの結果が画面に表示されたのですか?
退会済みユーザー

退会済みユーザー

2017/10/30 04:47

確かに確認しましたが、画面のリロードはありませんでした。その後var_dump($_POST);を記述し、ページの更新をしたところ、usernameとbodyが画面に表示されました。その後何度かpostしてみましたが、POSTの中身に変更はありませんでした。thread_idのみが、DBに反映されているのは何故なのでしょうか?
ooeok

2017/10/30 04:59

考えられるのは$.ajax内でfalseを返していることでしょうか。 > return false; でもそれだとajaxが実行された上でformのpostが飛ばないはず。 自分でテストしてみないと何が起こっているか分からないです。 とりあえずtype="submit"ではなく、type="button"にしてみてはどうでしょう。 で、開発ツールのnetworkで監視しときましょう。
guest

0

$stmt->bindParam(':name',$_POST['name']);

$stmt->bindParam(':body',$_POST['text']);

POSTするのは「username」と「body」だけど
参照しているのは「name」と「text」になっています

postする場合と違うロジックでajaxで更新する仕組みになっているか確認下さい

追記

もとから「$sledid」を渡していますが、これはpostsテーブルに対してpost_idは
ユニーク属性をもっていて、渡したデータは絶対に存在しないという保証はあるのでしょうか?
もしそうでない場合は、データが競合してエラーになっている可能性はあります。

たとえばinsert into on duplicate update構文で更新をする必要があるかもしれません

投稿2017/10/30 04:09

編集2017/10/30 04:33
yambejp

総合スコア114769

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

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

masaya_ohashi

2017/10/30 04:24

ajaxで送っているdataではnameとtextになっているのであっていませんか?
yambejp

2017/10/30 04:35

masaya_ohashiさん、ありがとうございます。 おっしゃる通り、ajaxでnameを付け替えているので私の指摘は合理的ではなかったです あらためて指摘を追記しておきました
guest

0

javascript

1var data = { 2 id:$('#comment_thread_id').val() , 3 name:$('#comment_user_name').val() , 4 text:$('#comment_text').val() 5 };

の部分はPHPで受け取る場合JavaScript(jQuery)側の指定が、

type: "POST" となっていますから、PHP側でフォームのmethd="post"となっている場合と同じで、以下のようにJavaScriptから送られたデータがPHP側で以下のように受け取れるはずです。

php

1$id = (string)filter_input(INPUT_POST, 'id'); 2$name = (string)filter_input(INPUT_POST, 'name'); 3$text = (string)filter_input(INPUT_POST, 'text');

投稿2017/10/30 07:40

naohiro19_

総合スコア178

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問