
現在、ajaxを用いて、入力されたデータをデータベースに保存して、別の部分に反映させるというプログラミングを書いております。
プログラミングを書き進めて、実際にデータベースにデータを格納することはできました。しかし、その後、json形式にしてデータを反映させる処理ができません。お時間を取らせてしまい申し訳ありませんが、ここさえ解決すると一気に進めそうなので協力の方をお願いいたします。
ソースコードは下です。わかりやすいように簡易版でまとめます。
ソースコード
js
1$("#registration").on('click',function(){ 2 $.post('_Ajax.php',{ 3 dataType:'json', 4 name:$('#name').val(), 5 url:$("#url").val(), 6 mode:'reg' 7 }).done(function(res){ 8 console.log("こんにちは!"); 9 }).fail(function(XMLHttpRequest, textStatus, errorThrown){ 10 console.log('失敗'); 11 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 12 console.log("textStatus : " + textStatus); 13 console.log("errorThrown : " + errorThrown.message); 14 }); 15 });
PHP
1//jsから渡ってきた値を処理するコード。今回はPHP・Aとする 2<?php 3require_once('management.php'); 4 5$ajax_processing = new DB(); 6 7if ($_SERVER['REQUEST_METHOD'] === 'POST') { 8 try { 9 $res = $ajax_processing->post(); 10 header('Content-Type: application/json'); 11 echo json_encode($res); 12 exit; 13 } catch (Exception $e) { 14 header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); 15 echo $e->getMessage(); 16 exit; 17 } 18}
PHP
1//classについて記入しているコード。今回はPHP・Bとする 2//一応POSTメソッドを記入。データベースの読み込み等は省略します。 3<?php 4 class DB{ 5 public function post(){ 6 switch ($_POST['mode']){ 7 case 'reg'; 8 return $this->registration(); 9 } 10 } 11 12 13 public function registration(){ 14 $sql = "insert into deck_data(name,leader,type,url) values (:name,:leader,:type,:url)"; 15 $stmt = $this->_db->prepare($sql); 16 $stmt->execute(array( 17 ":name"=>$_POST['name'], 18 ":url"=>$_POST['url'] 19 )); 20 21 return[ 22 'id' => $this->_db->lastInsertId() 23 ]; 24 }
自分で行ったこと
ここの部分では、どのような流れで上記のコードになったのかを説明していきます。
1、原因解明
データベースにデータは入力されているので、
・ $res = $ajax_processing->post();
の部分まではうまく行っていると思った。その後の部分に問題があると思い、done(res)以降を「console.log("こんにちは!");」に変更。結果、「こんにちは」は返ってこなかった。fail処理を用意してみたら、failに書いた処理の方が反映された。
→やはりjson形式でうまく返せていないことを確認した。json書き方自体に問題があると分析した。
2、値を代入してみる
そもそもjson形式にする値がないのではないかと仮定した。なので、以下のコードを「$res = $ajax_processing->post();」の上に入れてみた。
$data = array(
"name" => $_GET["name"],
"url" => $_GET['url']
);
結果はターミナルで立てたビルドインサーバーの方に「PHP Notice: Undefined index: name in (データの場所)」というエラーメッセージが出てきた。
→どうしてnameが定義されていないのか理解できなくなり、余計混乱してくる。
※これは「_GET」を「_POST」に変更するだけで大丈夫でした。
3、エラーの検証(未解決)
そもそもエラーが何かを知りたくなったので、エラーを検出するコードをネットから拾って、入力。結果は下になった
・ textStatus : parsererror
・ errorThrown : Unexpected token < in JSON at position 2
どうやらjsonの中にHTMLの形で入ってしまっている?JSONの値の中に「<」というものがあって、それが混乱を招いているということがわかった。
→しかし、json形式で返しているし、どのようにすると「<」取り除かれるのかわからない。どこを改善すればいいのかがわからなくてお手上げ状態。
4、あるサイトを参考(未解決)
「ajaxではまった話」こちらのサイトを参考に
echo $res->request->is(['ajax']); …①
を、$this=$ajax_processingの部分に入れてみた。結果、「こんにちは」とは表示された。しかし、「console.log('こんにちは')」の下に「console.log(data)」を入れてみると、「Using $this when not in object context」というエラーが出てしまう。①が結局何かもわからない
主にわからないこと
・そもそもjsで最初に定義した値(「name」や「mode」など)はPHP・Aではどのように使われて、どのようにjson形式で返せばいいのかが理解できない(未解決)
・$resとは何をしているものなのか。そしてjson形式で返ってきた後のdoneで使われているresは同じものなのか、それとも違うものなのか?(解決!今は考えなくて良い)
・json形式から返ってきた際のfunctionの引数が人によって「data」だったりするが、ここに入れる引数はどのようなものなのか?(上に同じ)
・現状どのような問題があってdoneに行けないのか
その他必要な情報があれば随時追記していきます。ajaxの仕組みで理解できていない部分がいくつかあるため、今回のようなミスをしてしまったかもしれないです。もし、ここが理解できていないという部分がありましたら教えていただける人も募集いたします。
お時間を取らせてしまうようですが、よろしくお願いいたします。
※$.postの部分に入れるdataについて
現在、ajax処理を行うために$.postを用いている。そこに「name」と「url」というものがそれぞれあるが、これらをdataに入れた方がいいことは理解している。
しかし、dataにしてしまうとデータベースに反映されなくなってしまう。
なので、現状はこのような形にしているが、もしdataに入れる方法がわかるのであれば教えて欲しいです。
コード
$.post('_Ajax.php,{
data:{
name:name,
url:url
},
mode:"reg",
})~
結果
undifined index:name (場所(PHP・Bの":name"=>$_POST['name'],))
undifined index:name (場所(PHP・Bの))
旧ソースコード(こちらは参考にしなくても結構です。)
js
1$("#registration").on('click',function(){ 2 var name = $('#name').val(); 3 var url = $("#url").val(); 4 $.post('_Ajax.php',{ 5 dataType:'json', 6 name:name, 7 url:url, 8 mode:'reg' 9 }).done(function(res){ 10 console.log("こんにちは!"); 11 }).fail(function(XMLHttpRequest, textStatus, errorThrown){ 12 console.log('失敗'); 13 console.log("XMLHttpRequest : " + XMLHttpRequest.status); 14 console.log("textStatus : " + textStatus); 15 console.log("errorThrown : " + errorThrown.message); 16 }); 17 });
PHP
1//jsから渡ってきた値を処理するコード。今回はPHP・Aとする 2<?php 3require_once('management.php'); 4 5$ajax_processing = new DB(); 6 7//今回はmanagementクラスのインスタンスを作って、post()というメソッドを呼び出す処理を書いている 8if ($_SERVER['REQUEST_METHOD'] === 'POST') { 9 try { 10 11 $res = $ajax_processing->post();//PHP・Bに飛ぶようにプログラミング 12 // jsonであることを知らせている 13 header('Content-Type: application/json'); 14 echo json_encode($res); 15 exit; 16 } catch (Exception $e) { 17 header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); 18 echo $e->getMessage(); 19 exit; 20 } 21}
PHP
1//classについて記入しているコード。今回はPHP・Bとする 2//一応POSTメソッドを記入。データベースの読み込み等は省略します。 3<?php 4 class DB{ 5 public function post(){ 6 switch ($_POST['mode']){ 7 case 'reg'; 8 return $this->registration(); 9 } 10 } 11 12 13 public function registration(){ 14 $sql = "insert into deck_data(name,leader,type,url) values (:name,:leader,:type,:url)"; 15 $stmt = $this->_db->prepare($sql); 16 $stmt->execute(array( 17 ":name"=>$_POST['name'], 18 ":url"=>$_POST['url'] 19 )); 20 21 return[ 22 'id' => $this->_db->lastInsertId() 23 ]; 24 }


回答6件
あなたの回答
tips
プレビュー