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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

Q&A

解決済

2回答

743閲覧

PHPで、filter_input に際して、boolean はどう送れば宜しいでしょうか?

nikuatsu

総合スコア177

PHP

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

0グッド

0クリップ

投稿2022/06/22 03:14

編集2022/06/23 00:20

前提

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}

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずjsで送るときの値をJSON.stringifyする
PHP側でjson_decodeして評価する

javascript

1const body=new FormData(); 2body.append("v[]",JSON.stringify(false)); 3body.append("v[]",JSON.stringify(null)); 4body.append("v[]",JSON.stringify(0)); 5body.append("v[]",JSON.stringify("0")); 6body.append("v[]",JSON.stringify("")); 7fetch("sample.php",{method:"post",body}).then(res=>res.json()).then(console.log);

//sample.php

PHP

1<?PHP 2$v=filter_input(INPUT_POST,"v",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3$v=array_map(function($x){ 4 return json_decode($x); 5},$v); 6print json_encode($v);

$.ajax処理

javascript

1 const post_data = { 2 comment : 'hello', 3 is_official: false 4 }; 5 const data = { 6 action : 'test_ajax', 7 post_data : JSON.stringify(post_data), 8 } 9 $.ajax({ 10 url : 'sample.php', 11 type : 'POST', 12 dataType: 'json', 13 data : data 14 }).done(function(res) { 15 console.log(res); 16 });

//sample.php
PHP側で何をしたいかわからないのでとりあえず
おくられてきたjsonデータをそのまま表示

PHP

1<?PHP 2$post_data=filter_input(INPUT_POST,"post_data",FILTER_DEFAULT); 3print $post_data;

投稿2022/06/22 03:32

編集2022/06/23 00:42
yambejp

総合スコア114843

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

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

nikuatsu

2022/06/23 00:16

ありがとうございます。 ご提示の内容から、該当のソースコードの修正点を自分なりに解釈し、質問文の「yambejp様のご回答を受けて」へ記載させて頂きました。★の2か所が修正点です。 私のこの解釈は何が誤っているでしょうか?
yambejp

2022/06/23 00:33

$.ajaxはマストという認識でしょうか?また今回は渡すデータが配列ではないので書き方は違います
nikuatsu

2022/06/23 00:45

>$.ajaxはマストという認識でしょうか? なるほどつまり $.ajax か否かで異なってくるというわけですか。$.ajax 以外の記述でajaxを試したことがないだけなのでマストではございませんが、やりやすいという意味でベターではあります。 >渡すデータが配列ではない FormDataは配列ではないのですか?あっ、new 、オブジェクトですかこれ。なるほど。今まで常に配列でのみ値を渡しておりましたので、FormDataを使いオブジェクトを渡すことの利点は考えたことがありませんでした。調べてみます。
nikuatsu

2022/06/23 00:48

$.ajax処理の方追記ありがとうございました。オブジェクトの方向でも色々調べてみます。
yambejp

2022/06/23 00:54

参考までに・・・FormDataは$.ajaxでも使えます。 fetchでpostするときの標準データがformDataなので最初の例になっています formDataで処理するメリットは同じパラメータ名で複数のデータが送れることです 最初の例だと"v[]"という名前で複数のデータをおくっていてPHP側はそれを 配列として処理しています。そのへん考え方に慣れるまで違和感が残るかもしれません
guest

0

勝手にfalseが"false"のようなstring型に変換されてしまいます。

発想が逆です。

(JSONにエンコードするなどせず)POSTした値がPHPに届くときは、どんな値も(ファイルを除いて)文字列として届くのです。他の型として使いたければ変換が必要です。

投稿2022/06/22 05:16

maisumakun

総合スコア145184

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

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

nikuatsu

2022/06/23 00:04

ご提示頂いた FILTER_VALIDATE_BOOLEAN のリンクを見ても確かに、仰る通り「文字列で届くから、後はそこからどうにかすべき」という設計が読み取れますね。なるほど。ありがとうございます。
nikuatsu

2022/06/23 00:23

つまり、該当のソースコードの8行目では、「is_bool」でなく下記のように検証するのがセオリーだということですよね? if ( ! is_bool( $post_data['is_official'] ) ) $valided[] = 'is_official がダメ'; ↓こう検証すべき if ( $post_data['is_official'] !== 'false' && $post_data['is_official'] !== 'true' ) $valided[] = 'is_official がダメ';
maisumakun

2022/06/23 00:54

true/falseの処理に関して「何」を送るべきかは、自分でルールを決めないといけません。たとえば、前述のFILTER_VALIDATE_BOOLEANでは、true/false以外にyes/no、on/off、1/0、空文字列を受け付けるようになっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問