商品登録のフォームを作成しています。
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(); }