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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Ajax

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

Q&A

解決済

1回答

1567閲覧

ajaxでmysqlにINSERT INTOできない

SugiuraY

総合スコア317

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Ajax

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

0グッド

0クリップ

投稿2019/09/01 15:23

編集2019/09/02 03:36

下記のように、AJAXでMYSQLにデータを格納したいのですが、なんら格納されません。
また、AJAXで出力された$respの結果は””(空)でした。MYSQLのテーブルの名称や構造は正しいということは確認しているのですが、どこか誤りがあればご助言をいただければ幸いです。
よろしくお願い致します。

php

1//main.php 2//前略 3<input type="radio" name="radio" value="left"> 4<input type="radio" name="radio" value="right"> 5<textarea class="textarea"></textarea> 6<button class="submit">送信</button> 7<?php include('includejs.php');?> 8//後略 9

php

1//includejs.php 2$(function(){ 3 $('.submit').on('click',function(){ 4 5 6 let textarea = $('.textarea').val(); 7 let select = $('input[name="radio"]:checked').val(); 8 let idnum = <?php h($_GET['id']);?>; 9 let username = "<?php h($_SESSION['name']);?>"; 10 11 12 $.ajax({ 13 type:'POST', 14 url:'Ajax.php', 15 datatype:'json', 16 data:{ 17 sel:select, 18 tex:textarea, 19 id:idnum, 20 user:username 21 } 22 }) 23 .then( 24 function(data){ 25 console.log(data); 26 },function(){//pattern fail 27 alert('通信に失敗しました、通信環境を確認してください'); 28 }) 29 } 30 } 31 }) 32 })

php

1//Ajax.php 2//前略 3<?php 4$get_textarea=$_POST['tex']; 5$get_select=$_POST['sel']; 6$get_id=$_POST['id']; 7$get_user=$_POST['user']; 8 9 try { 10 $pdo->beginTransaction(); 11 try { 12 $stmt = $pdo->prepare('INSERT INTO result_table (selection,maincomment,pageid,username) VALUES (:selection,:maincomment,:pageid,:userame)'); 13 $stmt->bindValue(':selection',$get_select,PDO::PARAM_STR); 14 $stmt->bindValue(':maincomment',$get_textarea,PDO::PARAM_STR); 15 $stmt->bindParam(':pageid',$get_id,PDO::PARAM_INT); 16 $stmt->bindValue(':username',$get_user,PDO::PARAM_STR); 17 $stmt->execute(); 18 $resp="success"; 19 $pdo->commit(); 20 } catch (PDOException $e) { 21 $pdo->rollback(); 22 $resp="error1"; 23 throw $e; 24 } 25 } catch (PDOException $e) { 26 $resp=$error2; 27 exit(); 28 } 29 30 31 32header('Content-type:application/json;charset=utf-8'); 33echo json_encode($resp); 34?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/01 15:32

JSON 形式にできない(KVSではない)から json_encode でエラーになってるんだろう
SugiuraY

2019/09/01 15:54

コメントありがとうございます。 Exceptionによって出力されるエラーコードについて、JSON形式ではなくどのような形でサーバーから受け取り出力できるかを今調べて始めております。一方でこれは$respへの値格納やその出力であり、INSERT INTO自体の実行の可否とは直接関連はないと思われますが、 INSERT INTOのPDO文法自体には誤りがないと思うのですが、その点、いかがでしょうか?根本的な考え方に誤りがあれば誠に申し訳ございませんが、よろしくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2019/09/01 16:02 編集

エラーを握りつぶして(非表示設定等) 把握しない人には回答の糸口を相手にも与えない状態です。
takasima20

2019/09/01 17:20

自分だったらAjax.phpに少し手を入れて直に動かして動作確認するかなあ。
mari.rinn

2019/09/01 23:42

$('input[name="radio"]:checked').val() の最後;が抜けてるんですが、jqueryのエラー出てませんか? ブラウザがchromeならf12キー押して確認してください。
m.ts10806

2019/09/02 00:25

コミットはその位置でいいのだろうか というかこのケースでtry重ねる意味はあるのだろうか というところは気になります。 SQLが間違ってないかどうかは固定値で直接DBに対して実行して確認してください(あとすでに指摘されてるように開発中のものでexception拾ってなかったりどこにも出してないのはイカンです)
SugiuraY

2019/09/02 03:33

asahina1979様、m.ts10806様 コメントを頂きありがとうございます。 exceptionに出力については、私の知識不足で申し訳ございませんが、調べて実行していくうちにcatchの中でvar_dump($e->getMessage());することで、ajaxの返り値として受け取ることができ、console.logとして表示させることができました。 実は初心者の私の先入観であったのですが、サーバー側でheaderも指定しないでブラウザに出力されるために用いるvar_dumpの結果を出力することができることを知りませんでした、、、 ajax上、受け取り値を'json'で指定したのであれば header('Content-type:application/json;charset=utf-8'); echo json_encode($resp); の様に一旦headerを指定してブラウザにjson_encodeして出力しなければexceptionの内容を受け取れないと思っていて、どうすれば良いのだろうと困っておりました。 結果的に上記の通り直接catchの中でvar_dump($e->getMessage());することでajaxのfunction(data)で受け取れることを知りました。 https://www.php.net/manual/ja/function.var-dump.phpでvar_dumpの性質を調べたのですが、特段json形式です出力されるもの等の記載がないので、なぜこれが実行できるのかを調べております。 何れにしても、exceptionの出力に関して、勉強不足で申し訳ございませんでした。
SugiuraY

2019/09/02 03:34

mari.rinn様 コメントありがとうございます。 本件は統一して;を付すべきでしたが、コードの実行自体には特段影響ございませんでした。 読みづらいコードを提供をしてしまった点お詫び申し上げます。 質問内容は修正いたします。
SugiuraY

2019/09/02 03:37

takasima20様 コメントありがとうございます、結果的にAjax.phpの間違いでした。 下記回答者の方のコメント内に詳細を記載させていただきます。 ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

全体的にグダグダ・・・

<button class="submit">送信</button>

<button class="submit" type="button">送信</button>

$_GET['id']

インクルードしている時点でgetは渡ってないですよね?
もしからだとnoticeが返るか、仮に空でも

let idnum = ;

となり、結局構文エラー
それと$_GETや$_POSTを直接参照するのは効率的ではないので
filter_inputを利用してください

datatype:'json',

とりあえず

datatype:'text',
でデバッグしてください

ajaxのthenはdone/failに変えるか
2つ目のコールバックでエラーを拾ってください

jQueryの読み込みや、pdoの宣言などは省略しているだけで
ホントは設定してあるんですよね?

投稿2019/09/02 00:34

yambejp

総合スコア114779

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

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

SugiuraY

2019/09/02 04:00 編集

ご回答いただきありがとうございます。 不完全なコードでのご質問について、お詫び申し上げるとともに、今後に活かさせていただきます。 ●<button class="submit">送信</button> >typeの指定内容により、エラーの出どころの可能性も変わってくるため、当然、明確に指定して記載すべきでした、申し訳ございません。 ●$_GET['id'] 前後の文脈が不完全で申し訳ございませんが、includeの時点で適切に値が渡っていることを確認しております。filter_inputはお恥ずかしながら存じ上げませんでした。マニュアルを調べて、理解できたので今後はこちらに原則切り替えます。 ●datatype:'json', この点を糸口に解決に至りました。私の大きな問題として、上記の追記修正依頼にコメントをさせていただいた通り、質問を投稿させていただいた時点で、json形式で値を受け取る際にどのようにしたら、exceptionの内容を受け取るかわからずにとりあえずjson形式で受け取り、また適切にそのエラー内容の出力が行われていませんでした。 そこで、他のコード例を拝見してcatchの中で var_dump($e->getMessage()); のように直接dumpすれば、json形式を気にすることなくエラー内容を出力することができました。 その結果、出力された内容は以下の通りでした。 "SQLSTATE[HY093]: Invalid parameter number: parameter was not defined" そこでよく確認すると、プレイスホルダと、それをバインドする際に、以下の不一致があることを発見しました。 :userame $stmt->bindValue(':username',$get_user,PDO::PARAM_STR); ただのタイプミスですが、これで個数の不一致であったことから、正しくエラー出力できれば問題を簡単に切り分けることができたため、大いに反省しております。ただ、var_dumpであればなぜ形式を機にすることなく直接ajaxで受け取ることができるのかがどうしてもわからないので、現在調べております。 ●ajaxのthenはdone/failに変えるか2つ目のコールバックでエラーを拾ってください こちらの違いはすぐに調べてもわからなかったため、特にjs上のエラーを拾う方法がよく理解できていないため、しっかりと調査してみます。 ●jQueryの読み込みや、pdoの宣言 こちらも指摘されてから気づかされるのですが、エラー出力がされていない以上、当然こういった凡ミスが原因で動作しない可能性があるため、ご回答者に配慮できるように精進してまいります。確かにこのようなミスによるものであれば、提示するコードだけれは何も仰ることはできないですね。。。がんばります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問