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

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

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

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

Q&A

解決済

2回答

8728閲覧

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

tacchan

総合スコア60

MySQL

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

0グッド

0クリップ

投稿2015/11/26 15:38

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

javascript

1<html> 2<head> 3<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 4<script type="text/javascript"> 5var obj = {dis:100}; 6$.ajax({type: 'POST', 7 url: "uketori_test.php", 8 data: obj, 9 contentType : 'application/json' 10 }); 11</script> 12</head> 13<body> 14</body> 15</html>

PHP

1<?php 2$db=new PDO('mysql:host=localhost;dbname=spot_data;charset=utf8;', 'root', ''); 3$dis = $_POST['dis']; 4$table = <<<_table_ 5INSERT INTO test ( 6 distance 7)VALUES 8($dis) 9_table_; 10$db->query($table);

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

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

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

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

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

guest

回答2

0

ベストアンサー

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なので、これで問題なく送信されるはずです。

JavaScript

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

もし、どうしても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/26 21:09

編集2015/11/26 21:12
sounisi5011

総合スコア697

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

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

tacchan

2015/11/27 01:19

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

0

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

例えば、

PHP

1<?php 2ob_start(); 3var_dump($_POST); 4$out = ob_get_contents(); 5ob_end_clean(); 6file_put_contents("post.txt", $out);

というコードをuketori_test.phpに記述すると$_POSTをvar_dumpした結果がpost.txtに出力されるので試してみて下さい。

投稿2015/11/26 16:10

tanat

総合スコア18711

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

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

tacchan

2015/11/26 16:39

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

2015/11/27 01:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問