前提
ajaxを通じて連想配列$post_data
を送り、その値を検証にかけています。
実現したいこと
filter_input
で$post_data
内のis_official
が、正しくbool型であることを検証したいです。
発生している問題
勝手にfalse
が"false"
のようなstring型に変換されてしまいます。
そのため下記の該当のソースコードで echo された値( JavaScript 側の res ) を見ると'is_official がダメ'
が入ってしまっており、bool型の検証ができていないことが分かります。
該当のソースコード
この問題のせいで、次のPHPの検証でis_bool
が使えないのです。
PHP
1function test_ajax() { 2 // POSTの確認 3 $post_data = filter_input(INPUT_POST, 'post_data', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); 4 5 // POSTの検証 6 $valided = []; 7 if ( mb_strlen( $post_data['comment'] ) > 100 ) $valided[] = 'comment がダメ'; 8 if ( ! is_bool( $post_data['is_official'] ) ) $valided[] = 'is_official がダメ'; 9 10 // 検証結果をJSで確認 11 /* 12 echo された値( JavaScript 側の res ) を見ると 13 'is_official がダメ' が入ってしまっており 14 bool型の検証ができていないことが分かる 15 */ 16 echo json_encode( $valided ); 17 die(); 18 19}
JavaScript
1const post_data = { 2 comment : 'hello', 3 is_official: false 4}; 5 6const data = { 7 action : 'test_ajax', 8 post_data : post_data, 9} 10 11$.ajax({ 12 url : 'https://example.com/test_ajax.php', 13 type : 'POST', 14 dataType: 'json', 15 data : data 16}).done(function(res) { 17 console.log(res); 18});
試したこと
検証を最優先し、連想配列$post_data
を送らずその中身である$comment
と$is_official
を個別に送り、filter_input
ではオプションにFILTER_VALIDATE_BOOLEAN
を使う、という以下の変更を考えましたが、これしかないでしょうか?
PHP
1function test_ajax() { 2 // POSTの確認 3 $comment= filter_input(INPUT_POST, 'comment'); 4 $is_official= filter_input(INPUT_POST, 'is_official', FILTER_VALIDATE_BOOLEAN); 5 6 /*--- 以下、該当のソースコードと同じなので割愛 ---*/ 7 8}
補足情報(FW/ツールのバージョンなど)
PHP 7.2 です。
yambejp様のご回答を受けて
ご回答のコードを質問に沿って記述しますと次のようになるのかと解釈しました。2つの★が変更点です。
しかし該当のソースコードと同様にres
には'is_official がダメ'
が入ってしまっておりました…。
解釈が誤っておりましたら改めてご教示頂けませんでしょうか。
PHP
1function test_ajax() { 2 // ★POSTの確認 3 $post_data = filter_input(INPUT_POST,"post_data",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 4 $post_data = array_map(function($x){ 5 return json_decode($x); 6 },$post_data); 7 8 /*--- 以下、該当のソースコードと同じなので割愛 ---*/ 9 10}
JavaScript
1const data = { 2 action : 'test_ajax', 3 post_data : JSON.stringify(post_data), // ★JSON.stringify() を通す 4}
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/06/23 00:16
2022/06/23 00:33
2022/06/23 00:45
2022/06/23 00:48
2022/06/23 00:54