質問編集履歴

5

修正

2022/06/23 00:20

投稿

nikuatsu
nikuatsu

スコア177

test CHANGED
File without changes
test CHANGED
@@ -56,11 +56,11 @@
56
56
  ```
57
57
 
58
58
  ### 試したこと
59
- 検証を最優先し、連想配列`$post_data`を送らずその中身である`$comment`と`$is_official`を個別に送り、`filter_input`ではオプションに`FILTER_VALIDATE_BOOLEAN`を使う、という以下の変更を考えましたが、これしかないでしょうか?
59
+ 検証を最優先し、連想配列`$post_data`を送らずその中身である`$comment`と`$is_official`を個別に送り、`filter_input`ではオプションに`FILTER_VALIDATE_BOOLEAN`を使う、という以下の変更を考えましたが、これしかないでしょうか?
60
60
 
61
61
  ```PHP
62
62
  function test_ajax() {
63
- // POSTの確認
63
+ // POSTの確認
64
64
  $comment= filter_input(INPUT_POST, 'comment');
65
65
  $is_official= filter_input(INPUT_POST, 'is_official', FILTER_VALIDATE_BOOLEAN);
66
66
 

4

不要な部分を削除

2022/06/23 00:19

投稿

nikuatsu
nikuatsu

スコア177

test CHANGED
File without changes
test CHANGED
@@ -7,20 +7,15 @@
7
7
  ### 発生している問題
8
8
  勝手に`false`が`"false"`のようなstring型に変換されてしまいます。
9
9
 
10
- 具体的には、下記の該当のソースコートによって、ログファイルには次の内容が出力されるということです。
11
- ```log
12
- [22-Jun-2022 02:57:25 UTC] $post_data = {"comment":"hello","is_official":"false"}
10
+ そのため下記の該当のソースコードで echo された値( JavaScript 側の res ) を見ると`'is_official がダメ'`が入ってしまっており、bool型の検証ができていないことが分かります。
13
- ```
11
+
14
12
 
15
13
  ### 該当のソースコード
16
- この問題のせいで、次のPHPの最後の行のように検証で`is_bool`が使えないのです。
14
+ この問題のせいで、次のPHPの検証で`is_bool`が使えないのです。
17
15
  ```PHP
18
16
  function test_ajax() {
19
17
  // POSTの確認
20
18
  $post_data = filter_input(INPUT_POST, 'post_data', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
21
-
22
- // ログファイルに出力
23
- error_log( '$post_data = ' . json_encode($post_data) );
24
19
 
25
20
  // POSTの検証
26
21
  $valided = [];

3

yambejp様のご回答を受けて

2022/06/23 00:15

投稿

nikuatsu
nikuatsu

スコア177

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
  この問題のせいで、次のPHPの最後の行のように検証で`is_bool`が使えないのです。
17
17
  ```PHP
18
18
  function test_ajax() {
19
- // POST確認
19
+ // POST確認
20
20
  $post_data = filter_input(INPUT_POST, 'post_data', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
21
21
 
22
22
  // ログファイルに出力
@@ -56,15 +56,16 @@
56
56
  dataType: 'json',
57
57
  data : data
58
58
  }).done(function(res) {
59
+ console.log(res);
59
60
  });
60
61
  ```
61
62
 
62
63
  ### 試したこと
63
- 検証を最優先し、連想配列`$post_data`を送らずその中身である`$comment`と`$is_official`を個別に送り、`filter_input`ではオプションに`FILTER_VALIDATE_BOOLEAN`を使うしかないでしょうか?
64
+ 検証を最優先し、連想配列`$post_data`を送らずその中身である`$comment`と`$is_official`を個別に送り、`filter_input`ではオプションに`FILTER_VALIDATE_BOOLEAN`を使う、という以下☆の変更点を考えまたが、これしかないでしょうか?
64
65
 
65
66
  ```PHP
66
67
  function test_ajax() {
67
- // POST確認 → 該当のソースコードの値を個別に受け取って filter_input する
68
+ // POST確認
68
69
  $comment= filter_input(INPUT_POST, 'comment');
69
70
  $is_official= filter_input(INPUT_POST, 'is_official', FILTER_VALIDATE_BOOLEAN);
70
71
 
@@ -75,3 +76,29 @@
75
76
 
76
77
  ### 補足情報(FW/ツールのバージョンなど)
77
78
  PHP 7.2 です。
79
+
80
+ ### yambejp様のご回答を受けて
81
+ ご回答のコードを質問に沿って記述しますと次のようになるのかと解釈しました。2つの★が変更点です。
82
+ しかし該当のソースコードと同様に`res`には`'is_official がダメ'`が入ってしまっておりました…。
83
+
84
+ 解釈が誤っておりましたら改めてご教示頂けませんでしょうか。
85
+ ```PHP
86
+ function test_ajax() {
87
+ // ★POSTの確認
88
+ $post_data = filter_input(INPUT_POST,"post_data",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
89
+ $post_data = array_map(function($x){
90
+ return json_decode($x);
91
+ },$post_data);
92
+
93
+ /*--- 以下、該当のソースコードと同じなので割愛 ---*/
94
+
95
+ }
96
+ ```
97
+
98
+ ```JavaScript
99
+ const data = {
100
+ action : 'test_ajax',
101
+ post_data : JSON.stringify(post_data), // ★JSON.stringify() を通す
102
+ }
103
+ ```
104
+

2

修正

2022/06/23 00:07

投稿

nikuatsu
nikuatsu

スコア177

test CHANGED
File without changes
test CHANGED
@@ -22,9 +22,19 @@
22
22
  // ログファイルに出力
23
23
  error_log( '$post_data = ' . json_encode($post_data) );
24
24
 
25
- // 検証
25
+ // POSTの検証
26
+ $valided = [];
26
- if ( mb_strlen( $post_data['comment'] ) > 100 ) die('comment がダメ');
27
+ if ( mb_strlen( $post_data['comment'] ) > 100 ) $valided[] = 'comment がダメ';
27
- if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
28
+ if ( ! is_bool( $post_data['is_official'] ) ) $valided[] = 'is_official がダメ';
29
+
30
+ // 検証結果をJSで確認
31
+ /*
32
+ echo された値( JavaScript 側の res ) を見ると
33
+ 'is_official がダメ' が入ってしまっており
34
+ bool型の検証ができていないことが分かる
35
+ */
36
+ echo json_encode( $valided );
37
+ die();
28
38
 
29
39
  }
30
40
  ```
@@ -54,13 +64,11 @@
54
64
 
55
65
  ```PHP
56
66
  function test_ajax() {
57
- // POST確認
67
+ // POST確認 → 該当のソースコードの値を個別に受け取って filter_input する
58
68
  $comment= filter_input(INPUT_POST, 'comment');
59
69
  $is_official= filter_input(INPUT_POST, 'is_official', FILTER_VALIDATE_BOOLEAN);
60
70
 
61
- // 検証
71
+ /*--- 以下、該当のソースコードと同じなので割愛 ---*/
62
- if ( mb_strlen( $post_data['comment'] ) > 100 ) die('comment がダメ');
63
- if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
64
72
 
65
73
  }
66
74
  ```

1

スペースの調整

2022/06/22 03:15

投稿

nikuatsu
nikuatsu

スコア177

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  // 検証
26
26
  if ( mb_strlen( $post_data['comment'] ) > 100 ) die('comment がダメ');
27
- if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
27
+ if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
28
28
 
29
29
  }
30
30
  ```
@@ -60,7 +60,7 @@
60
60
 
61
61
  // 検証
62
62
  if ( mb_strlen( $post_data['comment'] ) > 100 ) die('comment がダメ');
63
- if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
63
+ if ( is_bool( $post_data['is_official'] ) ) die('is_official がダメ');
64
64
 
65
65
  }
66
66
  ```