【質問内容】
表題の件を達成したかったのですが調査を進めた結果、変数そのものを渡すことは出来ないということが分かりました。
そこで代替案として「Ajaxを使用してPOSTで値を渡したい」のですがうまくいきません。
初心者で大変申し訳ありませんがご教授頂けないでしょうか。
よろしくお願い致します。
・ローカルサーバーはXAMPPを使用しています。
・コンソールに「Ajax_success」と出るのでAjaxは動いているのではないかと思います。。
・InAppBrowserでWebページに飛びます(APIを想定してはいません)←修正依頼を対応しました。
【monacaアプリのindex.html】
$.ajax({
type: "POST",
url: 'http://192.157.13.5/testajax.php',
data: {
'test': 2
},
success: function(j_data){
console.log("Ajax_success!!");//成功していたらコンソールに文字列を表示する
}
});
//ページ遷移
var ref = cordova.InAppBrowser.open('http://192.157.13.5/testajax.php');//ローカルサーバーのtestajax.phpに飛ぶ
【ローカルサーバーのtestajax.php】
$data = $_POST['test'];
echo $data;
【エラー内容】
Notice: Undefined index:test
【まとめ】
「Ajaxを使用してPOSTで値を渡す」ことは「InAppBrowser」を使用する場合出来ないということが分かりました。
そこで他の方法として「GETで値を渡す」方法を試したところうまくいきました。
【monacaアプリのindex.html】
2次元配列を「GET」で渡して「ローカルサーバー」に飛ぶ処理
//2次元配列の作成
var sendData = new Array();
sendData[0] = new Array();
sendData[1] = new Array();
sendData[2] = new Array();
//2次元配列にテストデータを入れる
sendData[0][0] = "key0";
sendData[1][0] = "key1";
sendData[2][0] = "key2";
sendData[0][1] = "a";
sendData[1][1] = "b";
sendData[2][1] = "c";
//console.log("what is sendData:"+sendData);
//配列をJSONオブジェクト化
var json_obj = JSON.stringify(sendData);
//console.log("what is json_obj"+json_obj);
//ページ遷移
cordova.InAppBrowser.open( 'http://192.157.13.5/testajax.php?data=' + encodeURIComponent( json_obj ),'clearcache=yes','clearsessioncache=yes' );//ローカルサーバーのtestajax.phpにGETで配列の情報を付けて飛ぶ
【ローカルサーバーのtestajax.php】
GETで受け取ったURIからデータを取得し配列に入れる処理。(渡したい値を再設定する処理)
「decodeURIComponent」してから「JSON.parse」で配列にしています。
<script type="text/javascript" charset="UTF-8">
var decode_obj ="";
//2次元配列の作成
var getData = new Array();
getData[0] = new Array();
getData[1] = new Array();
getData[2] = new Array();
if (1 < window.location.search.length) {
// 最初の6文字 (?data=) を除いた文字列を取得する
//monaca index.htmlのencodeURIComponent( json_obj ) と queryが同一文字列となる
var query = window.location.search.substring(6);//JSONオブジェクト化した2次元配列をエンコードしたものと同じもの
//document.write("what is query:"+query+"<br>");
decode_obj = decodeURIComponent( query );//JSONオブジェクト化した2次元配列
//document.write("what is decode_obj:"+decode_obj+"<br>");
getData = JSON.parse( decode_obj );//2次元配列
//document.write("what is getData:"+getData+"<br>");
}
</script>
【追記2】
XAMPPを使った環境の場合、GETメソッドで大量にデータを送信するとエラーが出て送信できないことがあります。
これは「LimitRequestLine」をいじることで回避できます。
LimitRequestLineについて
試しに「LimitRequestLine」の値を100000にしてみましたが、問題なく動作しました。
(あまり値が大きくなりすぎるとセキュリティ的によくないと思いますので、許容できる範囲がいいのではないかと思います。)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
Cordova は触った事も無いですがパラメータは ref.executeScript
で後から渡せるようです。
【Cordova 子Windowにパラメータを渡す - 調べたことメモ】
http://xshima2.blog.fc2.com/blog-entry-118.html
【Monacaドキュメント | Monaca】
http://docs.s.monaca.mobi/3.5/ja/reference/phonegap_3.5/ja/inappbrowser/#executescript
ref.executeScript(details, callback);
【Inappbrowser - Apache Cordova】
https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-inappbrowser/#inappbrowserexecutescript
PHP側はPOSTで受け取るわけではないので構造を考え直す(JavaScript主体でデータのやり取りをすることになる)必要がありますが、とりあえず現在の状況でエラーが出ているのを解消するには下記のように記述することになると思われます。
if ( isset( $_POST['test'] ) ) {
$data = $_POST[ 'test' ];
echo htmlspecialchars( $data, ENT_QUOTES, 'UTF-8' );
}
追記:
$.ajax({
type: "POST",
url: 'http://192.157.13.5/testajax.php',
data: {
'test': 2
},
success: function(j_data){
console.log("Ajax_success!!");//成功していたらコンソールに文字列を表示する
}
});
// ↑ これと ↓ これは違うページが返ってきますよ。上はPOSTを受け取った結果が、下はPOSTを受け取らなかったページが帰ってきます。
cordova.InAppBrowser.open('http://192.157.13.5/testajax.php');
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
エラーが出るのは
var ref = cordova.InAppBrowser.open('http://192.157.13.5/testajax.php');
この行で出ているのでは?
Notice: Undefined index:test
このエラーを返すのは、
$data = $_POST['test'];
の行です。
なので、$.ajax でアクセスされていることは間違いない。
Notice: Undefined index:test
は、POSTでアクセスしていないか、POSTでアクセスされていても、$_POST['test'] が渡されていないかどちらかです。
InAppBrowser プラグイン
http://s.docs.monaca.io/ja/reference/cordova_5.2/inappbrowser/
window.open のようにURLをオープンする機能なのですから、openが実行された時、特に何も設定していない限り、GETでのアクセスになるはず。だから、ここでエラーになっているはずという見立て。
index.php
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
$.ajax({
type: "POST",
url: './testajax.php',
cache: false,
data: {
'test': 2
},
success: function (data) {
console.log(data);
}
});
});
</script>
</body>
</html>
testajax.php
<?php
$test = filter_input(INPUT_POST, 'test');
echo $test;
上記ソースコードの実行結果 こちらの環境では 2 となります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
successをこうすれば2が返ってきてることがわかると思いますが
success: function(data){
console.log(data);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
cache:falseを加えてみてはどうでしょうか?
$.ajax({
cache: false,
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
fromageblanc
2016/11/18 18:06
http://192.157.13.5/testajax.php がウェブページなのか、APIなのかどちらを想定しているかを明記したほうがよいですよ。ちなみにInAppBrowser.openはブラウザですのでWebページが開くだけです。
t33
2016/11/18 18:49
ご指摘ありがとうございます。修正致しました。
kei344
2016/11/21 01:54
まだ質問が「受付中」になっていますが、どのように解決したのかを回答文に書き、「解決済」にされてはいかがでしょうか。
t33
2016/11/22 00:39
気付きませんでした。ありがとうございます。「解決済」に致します。