回答編集履歴

4

修正

2017/02/16 01:52

投稿

masaya_ohashi
masaya_ohashi

スコア9210

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  if(typeof data != 'object')return false;
94
94
 
95
- return encodeURIComponent("entry") + "=" + encodeURIComponent(data);
95
+ return encodeURIComponent("entry") + "=" + encodeURIComponent(JSON.stringify(data));
96
96
 
97
97
  }
98
98
 

3

誤字修正

2017/02/16 01:52

投稿

masaya_ohashi
masaya_ohashi

スコア9210

test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
  ```
100
100
 
101
- PHP側はこうです。あと、array_margeして$_GETと$_POSTを結合してますが、PHPには[$_REQUEST](http://php.net/manual/ja/reserved.variables.request.php)というGETとPOSTとCOOKIEをくっつけた変数が用意されています。
101
+ PHP側はこうです。あと、array_mergeして$_GETと$_POSTを結合してますが、PHPには[$_REQUEST](http://php.net/manual/ja/reserved.variables.request.php)というGETとPOSTとCOOKIEをくっつけた変数が用意されています。
102
102
 
103
103
  ```PHP
104
104
 

2

追記2

2017/02/16 01:29

投稿

masaya_ohashi
masaya_ohashi

スコア9210

test CHANGED
@@ -53,3 +53,55 @@
53
53
  return params.join( '&' );
54
54
 
55
55
  ```
56
+
57
+
58
+
59
+ ###追記
60
+
61
+ ご自分で書かれたコードを理解しておられないようなので1次元配列になる理由を説明します。
62
+
63
+ ```JavaScript
64
+
65
+ selectQuery.dataEncode = function(data){
66
+
67
+ if(typeof data != 'object')return false;
68
+
69
+ var params = [];
70
+
71
+ for(var idx in data){
72
+
73
+ var tmp = data[idx];
74
+
75
+ if(tmp.length < 1)return false;
76
+
77
+ params.push(idx + '=' + JSON.stringify(tmp));
78
+
79
+ }
80
+
81
+ return params.join( '&' ).replace( /%20/g, '+' );
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ このdataEncodeというfunctionに渡されてくるdataという変数は、あなたの用意したentryという多次元配列です。entryの外側の配列をfor文で回して、それぞれをパラメータ化しているから"0=['test','AA123456','test','pass']&1=["test2"]&2=['test3','BB123456']"という形になるのはむしろ正しい動作です。entryの形を維持したまま渡したいのであれば、下記のようなコードが正しいです。
88
+
89
+ ```JavaScript
90
+
91
+ selectQuery.dataEncode = function(data){
92
+
93
+ if(typeof data != 'object')return false;
94
+
95
+ return encodeURIComponent("entry") + "=" + encodeURIComponent(data);
96
+
97
+ }
98
+
99
+ ```
100
+
101
+ PHP側はこうです。あと、array_margeして$_GETと$_POSTを結合してますが、PHPには[$_REQUEST](http://php.net/manual/ja/reserved.variables.request.php)というGETとPOSTとCOOKIEをくっつけた変数が用意されています。
102
+
103
+ ```PHP
104
+
105
+ $input = json_decode($_REQUEST["entry"]);
106
+
107
+ ```

1

追記

2017/02/16 01:28

投稿

masaya_ohashi
masaya_ohashi

スコア9210

test CHANGED
@@ -27,3 +27,29 @@
27
27
  $array = json_decode($json, true); // $arrayには配列の形で格納されます
28
28
 
29
29
  ```
30
+
31
+
32
+
33
+ ###追記
34
+
35
+ 1次元配列になってしまう原因は、yambejpさんが正解だと思います。postする内容のパラメータ名、パラメータ値はそれぞれencodeURIComponentでエンコードしてやらないと、PHP側がうまくクエリを解析できません。jQueryのajax通信など、方法によっては勝手にそのへんの処理をしてくれるのですが、XMLHttpRequestはそのあたりを自前でやらなければいけません。
36
+
37
+ ```JavaScript
38
+
39
+ for(var idx in data){
40
+
41
+ var tmp = data[idx];
42
+
43
+ if(tmp.length < 1)return false;
44
+
45
+ // ここでパラメータ名とパラメータ値をencodeURIComponentをかけておく
46
+
47
+ params.push(encodeURIComponent(idx) + '=' + encodeURIComponent(JSON.stringify(tmp)));
48
+
49
+ }
50
+
51
+ // 半角スペースを+に変える処理はすでにencodeURIComponentがやっているので削除
52
+
53
+ return params.join( '&' );
54
+
55
+ ```