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

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

ただいまの
回答率

90.12%

AjaxでデータをPHPに送ったが、Undefined indexが出てしまう

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,393

tacchan

score 58

javascriptのajaxで外部ファイルのphpファイルに送り、MySQLに登録するというプログラムを書きたいのですが、
 Undefined index: dis in C:\xampp\htdocs\uketori_test.php on line 5
のようにnoticeが出てしまい、MySQLに登録できません。
サイトを検索したところ、初回と二回目以降で変わるから気にしないでいいみたいなことが書かれていたのですが、
scriptを実行したらデータベースに登録されているということをやってみたいので、無視できません。
たぶん、基本的なことを見落としているだけなのかもしれませんが、気づくことができないのでよろしくお願いします。

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
var obj = {dis:100};
$.ajax({type: 'POST',
        url: "uketori_test.php",
        data: obj,
        contentType : 'application/json'
        });
</script> 
</head>
<body>
</body>
</html>
 
<?php
$db=new PDO('mysql:host=localhost;dbname=spot_data;charset=utf8;', 'root', '');
$dis = $_POST['dis'];
$table = <<<_table_
INSERT INTO test (
    distance
)VALUES
($dis)
_table_;
$db->query($table);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

jQuery.ajax($.ajax)関数のオプションで、contentTypeプロパティに'application/json'を指定しているのが原因ではないでしょうか。

jQuery.ajaxcontentTypeプロパティは、Ajaxで送信するデータの形式を指定するものです。

$.ajax() | jQuery 1.9 日本語リファレンス | js STUDIO

ただのHTMLのフォームであれば、データの形式はapplication/x-www-form-urlencodedまたはmultipart/form-dataとなります。
そして、PHPの$_POSTは、application/x-www-form-urlencodedまたはmultipart/form-dataの形式で送信されたデータをPHPの連想配列へと変換し、それを保持する変数です。

PHP: $_POST - Manual

Content-Type に application/x-www-form-urlencoded あるいは multipart/form-data を用いた HTTP リクエストで、 HTTP POST メソッドから現在のスクリプトに渡された変数の連想配列です。

しかし質問のコードでは、送信データの形式がJSON(application/json)になっています。
このため、PHPは送信データを解析できず、$_POST変数が空の配列になる問題が出ているのでしょう。

解決策としては、jQuery.ajax関数のオプションからcontentTypeプロパティを削除してください。
jQuery.ajax関数のcontentTypeプロパティの初期値はapplication/x-www-form-urlencodedなので、これで問題なく送信されるはずです。

var obj = {dis:100};
$.ajax({
        type: 'POST',
        url: "uketori_test.php",
        data: obj // ここの後ろにあるカンマ( , )をとっておくように
        // contentTypeプロパティを削除
});

もし、どうしてもcontentTypeプロパティにapplication/jsonを指定しなくてはならないのならば、別の方法もあります。
php://inputを利用することで、Ajax送信された生のデータを読み出せるので、この生データのJSONをPHPの連想配列に変換するという方法があります。

「php://input」とは何?-POSTの生データ? | アイビースター

JSONを連想配列に変換する関数として、PHP5.2以降ではjson_decode関数があります。
※レンタルサーバの場合、この関数が無い事があります。

PHP: json_decode - Manual

以上を活用すれば、データを無事取得できるでしょう。

…ただ、この方法は中・上級向けだと思うので、オススメは出来ません。
送信データの形式をapplication/x-www-form-urlencodedまたはmultipart/form-data以外にしなくてはならない場合は限られるので、素直に前者のcontentTypeプロパティを省略する方法を選んだほうが良いと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/27 10:19

    ありがとうございます。
    contentTypeをなくすだけでよかったんですね。
    正常に受け渡すことができました。助かりました。

    キャンセル

0

こういった場合、どのような値をPHPが受け取っているか確認してみるのが解決への近道です。

例えば、
<?php
ob_start();
var_dump($_POST);
$out = ob_get_contents();
ob_end_clean();
file_put_contents("post.txt", $out);
というコードをuketori_test.phpに記述すると$_POSTをvar_dumpした結果がpost.txtに出力されるので試してみて下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/27 01:39

    回答ありがとうございます。
    post.txtにはarray(0) {
    }
    という結果が残っていました。
    つまり、受け渡せていなかったみたいです。
    その場合、どの様に直せばいいのでしょうか?

    キャンセル

  • 2015/11/27 02:58

    このあたりや
    http://js.studio-kingdom.com/jquery/ajax/ajax
    このあたり
    http://js.studio-kingdom.com/jquery/ajax/post
    を参照して、サンプルコードそのままでuketori_test.phpに送信してみて、
    送信される場合、送信され無い場合の違いを比較してみて下さい。

    キャンセル

  • 2015/11/27 10:21

    ありがとうございます。色々試してみて、勉強することにします。

    キャンセル

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

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