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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Ajax

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

Q&A

1回答

1208閲覧

Ajax:JSONで通信エラー

xxx0_0xxx

総合スコア9

MySQL

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2021/06/22 08:10

編集2021/06/23 00:02

商品登録のフォームを作成しています。
Ajaxを使用して、登録商品をDBに登録する作業を行っています。
dataType : "json"でDB登録はできるのですが、通信エラーにつながります。
dataType : "text"であると問題なく通信もでき、DB登録も可能です。
デバッグを確認したところ、

$result = array(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $result[] = array( // ここでデバッグが飛んでしまう。 $hoge1=>$row['number']; $hoge2=>$row['name']; $hoge3=>$row['price']; $hoge4=>$row['password']; $hoge5=>$row['confirmpass']; ); }

上記に記載したよう、デバッグが飛んでしまいます。
そのため、ここで配列に変換できていないことが分かったのですが、ここからどうやってJSONでも通信が成功するのかを解決できません。
詳しい方法を教えていただけたら幸いです。

// 登録ボタン押下 if(isset($_POST['signupBtn'])) { $hoge1=$_POST['number']; $hoge2=$_POST['name']; $hoge3=$_POST['price']; $hoge4=$_POST['password']; $hoge5=$_POST['confirmpass']; // 値はバインドさせる $sql = 'INSERT INTO table(number, name, price, password)VALUES(?, ?, ?, ?)'; // SQLをセット $stmt = $pdo->prepare($sql); // SQL実行 $stmt->execute(array($hoge1, $hoge2, $hoge3, $hoge4, $hoge5)); // 登録情報をDBに配列で挿入 // 先ほど追加したデータを取得 // idはlastInsertId()で取得できる $last_id = $pdo->lastInsertId(); $sql = "SELECT id, number, name, price, password FROM table WHERE id = ?"; // SQLをセット $stmt = ($pdo->prepare($sql)); // SQLを実行 $stmt->execute(array($last_id)); // 配列宣言 $result = array(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $result[] = array( $hoge1=>$row['number']; $hoge2=>$row['name']; $hoge3=>$row['price']; $hoge4=>$row['password']; ); } var_dump($row); header('Content-Type: application/json'); echo json_encode($result); }
$(function() { $("#signupBtn").on("click", function() { // actionで指定されたURLへ遷移しないようにする event.preventDefault(); // 新規登録フォームの入力値を取得 const number= $("#number").val(); const name = $("#name ").val(); const price= $("#price").val(); const password = $("#password ").val(); const confirmpassword = $("#confirmpassword ").val(); // 入力チェック if(number== '') { alert("商品番号を入力してください"); } else if (name == '') { alert("商品名を入力してください"); } else if (price== '') { alert("価格を入力してください"); } else if (password == '') { alert("パスワードを入力してください"); } else if (confpassword == '') { alert("確認用パスワードを入力してください"); } else if (password != '' && confpassword != '' && password != confpassword ) { // パスワード確認用 alert("パスワードの値が一致しません。"); } else { // 登録確認モーダル if (window.confirm('この内容で登録してもよろしいですか?')) { $.ajax( { type: "POST", url: "http://localhost/hogehoge/hoge.php", dataType : "json", data: { number: "number", name: name, price: price, password: password, confirmpass: confirmpass, } }).done(function(result) { // 成功時 alert("登録に成功しました。"); console.log('通信成功'); console.log(result); }).fail(function(jqXHR, textStatus, errorThrown) { // 失敗時 alert('登録に失敗しました。'); console.log("jqXHR : " + jqXHR.status); // HTTPステータスが取得 console.log("textStatus : " + textStatus); // タイムアウト、パースエラー console.log("errorThrown : " + errorThrown.message); // 例外情報 }).always(function() { // 通信が完了したときの処理 $("#signupForm").modal('hide'); // モーダルを閉じる }); } } }); });
// テーブル $dsn = "mysql:host=localhost;dbname=dbname;charset=utf8;"; $user = 'root'; $pass = ''; try{ $pdo = new PDO($dsn,$user,$pass); echo "DB接続成功<br>"; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->exec('create table if not exists m_employee( id not null auto_increment primary key, name not null, price not null, password not null, )'); } catch (PDOException $e) { echo "DB接続失敗 > " . $e->getMessage(); die(); }

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

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

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

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

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

K_3578

2021/06/22 08:22

よく間違えられますがデバックじゃなくて"デバッグ"です。
xxx0_0xxx

2021/06/22 08:35

「デバッグ」なんですね! 教えていただきありがとうございます。
K_3578

2021/06/22 23:53

ん・・・?直ってなくないか? >上記に記載したよう、デバックが飛んでしまいます。 とか。 コード内のコメントとか
guest

回答1

0

var_dump($row);

ここで余計な出力が行われてレスポンスがjsonにならないからでは。
他にも返したい情報とは無関係の出力がないか確認してください。
PHPタグ外はすべて出力となるので、スペースはおろか改行にも注意が必要です。

投稿2021/06/22 08:15

編集2021/06/22 08:32
m.ts10806

総合スコア80850

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

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

K_3578

2021/06/22 08:23

m.ts10806さん >開業 typoしてます。
m.ts10806

2021/06/22 08:32

ご指摘ありがとうございます。 時々スマホで回答してるとそのままやっちゃってますね。
xxx0_0xxx

2021/06/22 08:35

m.ts10806さん いつもご回答ありがとうございます。 ご提示いただいた通り、var_dump($row);を削除し、 そのほかにもコメント等を削除いたしました。 しかし、やはりjsonでは通信エラーが起こってしまいます・・・ 他に考えられる原因はあるのでしょうか?
m.ts10806

2021/06/22 10:24

コメントは削除する必要ないとは思いますが。 何のエラーかにもよりますね。
m.ts10806

2021/06/22 10:25

コピペしてください。
xxx0_0xxx

2021/06/22 11:03

jqXHR : 200 textStatus : parsererror errorThrown : Unexpected token D in JSON at position 0 上記エラーがGoogleのデバックに表示される状態です。 配列の作り方が悪いのでしょうか><
kei344

2021/06/22 11:10

echo "DB接続成功<br>";の「D」では?
m.ts10806

2021/06/22 11:12

そうですね。 dataType をJSONにしたからには全てのレスポンスをJSON形式にする必要があります。
m.ts10806

2021/06/22 11:13

一字目から違うのでそのように出ているものと。
xxx0_0xxx

2021/06/22 11:51

いろいろご指摘ありがとうございます。 以後気をつけます!
xxx0_0xxx

2021/06/22 11:54

kei344さん ご回答ありがとうございます。 echo "DB接続成功<br>";の「D」では? こちらも削除してみたのですが、やはり通信エラーになります・・・ textタイプでは送れるのですが、謎です><
m.ts10806

2021/06/23 00:25

結局私の回答に落ち着きます。 余計な出力があるからです。
m.ts10806

2021/06/23 00:25

コードがそのまま提示されない現状では他者にはこれ以上応えようがないです。
m.ts10806

2021/06/23 00:27

ちなみにPHPがシステム的に出力するエラーも含みます。 JSONのエラーに1文字しか出ないのはそこがおかしいからだけ。 画面で確認したいならリクエストをGETで送ってブラウザからクエリストリング付きでアクセスすると良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問