AjaxでデータをPHPに送ったが、Undefined indexが出てしまう
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 5,720
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
jQuery.ajax
($.ajax
)関数のオプションで、contentType
プロパティに'application/json'
を指定しているのが原因ではないでしょうか。
jQuery.ajax
のcontentType
プロパティは、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
プロパティを省略する方法を選んだほうが良いと思います。投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
例えば、
<?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に出力されるので試してみて下さい。投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/11/27 10:19
contentTypeをなくすだけでよかったんですね。
正常に受け渡すことができました。助かりました。