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

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

ただいまの
回答率

90.75%

  • PHP

    19207questions

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

  • MySQL

    5522questions

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

  • Ajax

    1035questions

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

  • PDO

    320questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,151
退会済みユーザー

退会済みユーザー

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

index.php
<?php

$id = $_SESSION["ID"]; //ここには整数が入ります。

?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>KENJA</title>
</script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript" src="main.js"></script>
  </head>

  <body>
    <input id="user_id" type="hidden" name="user_id" value="<?= $id;?>">       
    <p>名前<input id="name" type="text" name="name" ></p>
    <p>本文<input id="text" type="text" name="text" ></p>
    <input id = "ajax-button" type="button" name="" value="インサート">
  </body>
</html>
main.js
jQuery(function($){
    $('#ajax-button').click(function() {
      var id = $("#user_id").val();
      var user_name = $("#name").val();
      var text = $("#text").val();
    $.ajax({
        url : "ajax.php",
        type : "POST",
        data : {id:id,user_name:user_name,text:text}
    }).done(function(textStatus, xhr) {
        console.log("ajax通信に成功しました")
     }).fail(function(xhr, textStatus, errorThrown) {
        console.log("ajax通信に失敗しました");
    });
  });
});
ajax.php
<?php
require_once(__DIR__ . '/action.php');
$user = new Action();
$user->post();
header('Content-type:application/json; charset=utf8');
?>
action.php
<?php
require_once(__DIR__ . '/config.php');
class Action{
  public $_db;

  public function __construct(){
    $this->_db = new \PDO(DSN,DB_USERNAME,DB_PASSWORD);
  }

public function post(){
  $sql = "insert into posts (id,name,text) values (:id,:name,:text)";
  $stmt = $this->_db->prepare($sql);
  $stmt->bindValue(':id',$_POST['id']);
  $stmt->bindValue(':name',$_POST['user_name']);
  $stmt->bindValue(':text',$_POST['text']);
  $stmt->execute();
}
}
?>
config.php
<?php
ini_set('display_errors', 1);

define('DSN', '※');
define('DB_USERNAME', '※');
define('DB_PASSWORD', '※');
//接続は問題ありません。(PDOで確認済み)

session_start();

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

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

ajax.php
<?php
require_once('config.php');

$dbh = db_connect();

$_POST['id'];
$_POST['name'];
$_POST['text'];

$sql = "insert into posts (id,name,text) values (:id,:name,:text)";

$stmt = $dbh->prepare($sql);
$stmt->execute(array(

    ":id"=>$_POST['id'],

    ":name"=>$_POST['name'],

    ":text"=>$_POST['text']

  ));
config.php
<?php
ini_set('display_errors', 1);

define('DSN', '※');
define('DB_USERNAME', '※');
define('DB_PASSWORD', '※');
function db_connect( ){
 try{
   return new PDO(DSN,DB_USERNAME,DB_PASSWORD);
 }catch(PDOException $e){
   echo $e->getMessage( );
   exit;
 }
}
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • masaya_ohashi

    2017/11/01 18:44 編集

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/01 18:54

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/01 19:05

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

    キャンセル

回答 2

+1

気になる点

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 21:06

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

    キャンセル

  • 2017/11/01 21:17

    ajax.phpのheaderの行の後に
    echo json_encode($data);
    を追加してみてください

    $dataの中身は適当になんでも良いですが、通常は結果を配列で返し、
    jsでそれを受取処理をするのが通常です

    キャンセル

  • 2017/11/01 21:25

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 18:42

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

    キャンセル

  • 2017/11/01 18:45

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19207questions

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

  • MySQL

    5522questions

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

  • Ajax

    1035questions

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

  • PDO

    320questions

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