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

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

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

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

PDO

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

PHP

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

Ajax

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

Q&A

2回答

4739閲覧

AjaxでPOSTすると500 (Internal Server Error)になる。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PDO

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

PHP

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

Ajax

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

0グッド

0クリップ

投稿2017/11/01 08:53

編集2017/11/01 12:17

初めてご質問させていただきます。
至らない箇所、わかりづらい文等あると思いますがご容赦ください。
AjaxでPOSTし、PHPを通してMysqlにアクセスしたいのですが、なかなかうまくいきません。
タイトルにもある通り、500 (Internal Server Error)が発生してしまいます。
500番エラーはサーバー処理側のエラーなのでPHPに問題があるのではと思うのですが、記述ミス等は見当たらず、頭を抱えております。
御意見いただければ幸いです。

PHP

1index.php 2<?php 3 4$id = $_SESSION["ID"]; //ここには整数が入ります。 5 6?> 7<!DOCTYPE html> 8<html lang="ja"> 9 <head> 10 <meta charset="utf-8"> 11 <title>KENJA</title> 12</script> 13 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 14 <script type="text/javascript" src="main.js"></script> 15 </head> 16 17 <body> 18 <input id="user_id" type="hidden" name="user_id" value="<?= $id;?>">        19 <p>名前<input id="name" type="text" name="name" ></p> 20 <p>本文<input id="text" type="text" name="text" ></p> 21 <input id = "ajax-button" type="button" name="" value="インサート"> 22 </body> 23</html> 24

javascript

1main.js 2jQuery(function($){ 3 $('#ajax-button').click(function() { 4 var id = $("#user_id").val(); 5 var user_name = $("#name").val(); 6 var text = $("#text").val(); 7 $.ajax({ 8 url : "ajax.php", 9 type : "POST", 10 data : {id:id,user_name:user_name,text:text} 11 }).done(function(textStatus, xhr) { 12 console.log("ajax通信に成功しました") 13 }).fail(function(xhr, textStatus, errorThrown) { 14 console.log("ajax通信に失敗しました"); 15 }); 16 }); 17});

php

1ajax.php 2<?php 3require_once(__DIR__ . '/action.php'); 4$user = new Action(); 5$user->post(); 6header('Content-type:application/json; charset=utf8'); 7?>

php

1action.php 2<?php 3require_once(__DIR__ . '/config.php'); 4class Action{ 5 public $_db; 6 7 public function __construct(){ 8 $this->_db = new \PDO(DSN,DB_USERNAME,DB_PASSWORD); 9 } 10 11public function post(){ 12 $sql = "insert into posts (id,name,text) values (:id,:name,:text)"; 13 $stmt = $this->_db->prepare($sql); 14 $stmt->bindValue(':id',$_POST['id']); 15 $stmt->bindValue(':name',$_POST['user_name']); 16 $stmt->bindValue(':text',$_POST['text']); 17 $stmt->execute(); 18} 19} 20?>

php

1config.php 2<?php 3ini_set('display_errors', 1); 4 5define('DSN', '※'); 6define('DB_USERNAME', '※'); 7define('DB_PASSWORD', '※'); 8//接続は問題ありません。(PDOで確認済み) 9 10session_start();

追記致します
ajax.phpのNetwork Headers Form data
id:8
user_name:nameのtest
text:textのtest

[一応解決したので追記致します]
ajax.phpで直接DBにアクセスし、insertするとDBに保存できました。
詳しく解説いただければ幸いです。

php

1ajax.php 2<?php 3require_once('config.php'); 4 5$dbh = db_connect(); 6 7$_POST['id']; 8$_POST['name']; 9$_POST['text']; 10 11$sql = "insert into posts (id,name,text) values (:id,:name,:text)"; 12 13$stmt = $dbh->prepare($sql); 14$stmt->execute(array( 15 16 ":id"=>$_POST['id'], 17 18 ":name"=>$_POST['name'], 19 20 ":text"=>$_POST['text'] 21 22 ));

php

1config.php 2<?php 3ini_set('display_errors', 1); 4 5define('DSN', '※'); 6define('DB_USERNAME', '※'); 7define('DB_PASSWORD', '※'); 8function db_connect( ){ 9 try{ 10 return new PDO(DSN,DB_USERNAME,DB_PASSWORD); 11 }catch(PDOException $e){ 12 echo $e->getMessage( ); 13 exit; 14 } 15} 16?>

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

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

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

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

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

masaya_ohashi

2017/11/01 08:57

apache等のエラーログは追えないのでしょうか?500が出ているということは、何らかのエラーログが残っていると思うのですが
masaya_ohashi

2017/11/01 09:04

postsテーブルのidの型は何ですか?INTではありませんか?
yambejp

2017/11/01 09:04

ajaxではなく普通にpostすれば正しい表示が得られるのでしょうか?またajax.phpは同じサイト内で間違いありませんか?(はしょって書いているため実はクロスサイトってことはないですよね?)
退会済みユーザー

退会済みユーザー

2017/11/01 09:19

masaya_ohashi様 ローカルサーバーにて接続しており、エラーログはgoogleの検証で追っています。jquery.min.js:4 POST http://192.168.33.10:8000/ajax.php 500 (Internal Server Error) send @ jquery.min.js:4 ajax @ jquery.min.js:4 (anonymous) @ main.js:12 dispatch @ jquery.min.js:3 q.handle @ jquery.min.js:3と表示されています(正しくできているでしょうか?) idはint、nameはvarchar(200)、textはtextです。
masaya_ohashi

2017/11/01 09:21 編集

googleの検証とはchromeの開発者ツールのことですかね。500が返ってきている通信のレスポンス内容を見ることはできますか?おそらくそこにはサーバが返すエラーのトレース情報が載っていると思います。
退会済みユーザー

退会済みユーザー

2017/11/01 09:22

yamabejp様 PDO環境下でのpost()は確認しており、問題なくinsertできています。大変知識不足で申し訳ないのですが、同じサイト内とはどういった意味なのでしょうか?
masaya_ohashi

2017/11/01 09:33

先程の書き込みの続きですが、レスポンスだけでなく、リクエスト情報も確認してください。POSTしたデータが正しくid,user_name,textになっているかの確認をお願いします。
退会済みユーザー

退会済みユーザー

2017/11/01 09:39

masaya_ohashi様 jquery.min.js:4 ー>null==d?void 0:d))}以下略 が赤く表示されていますがこれがトレース情報なのでしょうか?
masaya_ohashi

2017/11/01 09:44 編集

jquery.min.jsという名前が出ている時点でサーバ側のログではないです。chromeの開発者ツールでやっているなら、Networkのタブにして、ajax.phpという名前で、赤くなっているデータがあるはずです。それを選んで、Headersというカテゴリの一番下にPOSTしたデータのリストが載っているはずです。その情報と、もう1つこの通信についてPreviewというタブにすると、サーバ側のエラーのトレース情報が出ているはずです。その情報が欲しいです。あと、その情報はここへの返答ではなく質問文を修正する形で記載お願いします。
退会済みユーザー

退会済みユーザー

2017/11/01 09:54

masaya_ohashi様 何から何まで教えていただき申し訳ないです!デバック方法をもう一度勉強しておきます。ご容赦ください。確認したところ、Networkにはindex.phpしかなく、エラーが発生しているajax.phpが表示されていませんでした。
退会済みユーザー

退会済みユーザー

2017/11/01 10:05

masaya_ohashi様 申し訳ありません!スクロールで赤色に表示されたajax.phpが出てまいりました!Previewには何も表示されておりませんでした!Headersは追記にて表示させておきます!
guest

回答2

0

気になる点

1.error_reportingの設定
→notice等の結果が出力され、jsonで返す前に出力があるためエラーとなっている可能性

2.require_onceの__DIR__階層
→絶対パスなら問題ないですがrequire_once('action.php');で良いような気がします

3.ajax.phpの「?>」の後に空白等が無いか?

投稿2017/11/01 10:54

yamaken114

総合スコア14

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

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

退会済みユーザー

退会済みユーザー

2017/11/01 12:06

ご回答ありがとうございます。返信遅くなり申し訳ありませんでした。 1:確認させていただきましたが、エラー等は出力されておりませんでした。 2:変更いたしました、ありがとうございます。 3:空白はありませんでした。
yamaken114

2017/11/01 12:17

ajax.phpのheaderの行の後に echo json_encode($data); を追加してみてください $dataの中身は適当になんでも良いですが、通常は結果を配列で返し、 jsでそれを受取処理をするのが通常です
退会済みユーザー

退会済みユーザー

2017/11/01 12:25

yamaken114様 丁寧に解説いただきありがとうございます。一応自分が抱えていた問題は解決したのですが、なぜそうなったのかが理解できておりません。もしよろしければ質問に追加しましたので一度ご覧頂ければ幸いです。また$dataの件でもしよろしければ教えていただきたいのですが、$.ajaxでpostした際に私の場合であればphpが受け取り、処理しているのですが、php->jsの場合のみにjson_encodeは使用するのでしょうか?それとも、$.ajaxにdefaultでjson_encodeが行われており、js->php,php->js共に言語間で受け渡しを行う際はjson_encodeが必要なのでしょうか?
guest

0

#別質問とごっちゃの回答していたのでこの回答は無視してください

投稿2017/11/01 09:11

編集2017/11/01 09:26
masaya_ohashi

総合スコア9206

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

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

退会済みユーザー

退会済みユーザー

2017/11/01 09:42

回答ありがとうございます。 https://teratail.com/questions/98419参考にします 自分のケースの場合、formを使わずにtype=buttonで行なっているのですが、それでも回答いただいたformのpostが働くのでしょうか?
masaya_ohashi

2017/11/01 09:45

いえ、勘違いでした。formタグを使っていないのにPOSTが発生することはないです。ごめんなさい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問