{{tag>プログラミング関連 PHP}} [[start]]>[[programming_start]] ~~NOCACHE~~ ====== PHP フォームからの入力を受け取る ====== PHPでフォームからの入力を受け取るには下記の2方式が一般的です。 - スーパーグローバル変数の ''$_GET[]'' と ''$_POST[]'' を使用 - ''filter_input()'' を使用 ===== $_GET[]・$_POST[]で受け取る ===== 入力フォームに文字列を入れて「送信」ボタンを押すと、下記に入力した文字列が表示されます。 ==== デモ ==== //(a.)フォームの表示 echo '

'; echo '
'; echo ''; echo ''; echo '
'; //(b.)フォームデータを受け取る if ( !isset($_GET['data1']) ) { $err='未受信'; }elseif ( is_array($_GET['data1']) ) { $err='配列は受診できません'; }else{ $str=$_GET['data1']; } //(c.)出力 if($err){ echo '

'.$err.'

'; }else{ //htmlページに出力する場合はエスケープ処理してから $str=htmlspecialchars($str,ENT_QUOTES,'UTF-8'); echo '

入力値は「'.$str.'」です

'; } echo '
';
==== コード ==== //(a.)フォームの表示 echo '
'; echo ''; echo ''; echo '
'; //(b.)フォームデータを受け取る(エラー処理含む) //(POSTで送信した場合は$_GET[]を$POST[]にする if ( !isset($_GET['data1']) ) { $err='未受信'; }elseif ( is_array($_GET['data1']) ) { $err='配列は受診できません'; }else{ $str=$_GET['data1']; } //(c.)出力 if($err){ echo '

'.$err.'

'; }else{ //htmlページに出力する場合はエスケープ処理してから $str=htmlspecialchars($str,ENT_QUOTES,'UTF-8'); echo '

入力値は「'.$str.'」です

'; } echo '';
==== 説明 ==== dokuwikiで実行する場合はページ中に「%%~~NOCACHE~~%%」を記入しキャッシュ機能をOFFにしてください。 **(a.)フォームを表示** 一般的なhtmlのフォーム送信と同じなので説明は省略します。 **(b.)フォームを受信** GETで送信した場合は「%%$_GET[name];%%」で、POSTで送信した場合「%%$_POST[name];%%」で受け取れます。 ''isset()''はフォームが送信されているか判定します。単純なif文 ''if($_GET[]){}'' でも判定できますがNoticeが発生するのでisset()を使用した方が良いです。この例では「$err='未受信';」としていますがエラー不要なら「$str=NULL;」や「$str="";」として処理しても良いです。 ''is_array()'' はフォームが「文字列」か「配列」を判定しています。今回は配列を処理できる仕組みになっていないのでエラーを出して受け取らないようにしています。配列でも問題ないプログラムなら「$str=$GET[name];」で$strに配列が格納されます。 **(c.)出力** 入力されたフォームには不正なHTMLやJavaScriptが含まれている可能性があるので、''htmlspecialchars()'' で無害化します。(表示以外の他の用途に使用する場合はそれぞれ対策が必要です。例えばファイル名にするならファイル名として不適切な文字を排除したり文字数制限を設けたり、、SQLデータベースに保存する場合はSQLインジェクション対策をします) ===== filter_inputで受け取る ===== 入力フォームに文字列を入れて「送信」ボタンを押すと、下記に入力した文字列が表示されます。 ==== デモ ==== //(a.)フォームの表示 echo '

'; echo '
'; echo ''; echo ''; echo '
'; //(b.)フォームデータを受け取る $str = filter_input(INPUT_GET, 'data2'); if ( $str===FALSE ) { $err='配列?'; }elseif ( $str===NULL ) { $err='未受信'; } //(c.)出力 if($err){ echo '

'.$err.'

'; }else{ //htmlページに出力する場合はエスケープ処理してから $str=htmlspecialchars($str,ENT_QUOTES,'UTF-8'); echo '

入力値は「'.$str.'」です

'; } echo '
';
==== コード ==== //(a.)フォームの表示 echo '
'; echo ''; echo ''; echo '
'; //(b.)フォームデータを受け取る(エラー処理含む) //(POSTで送信した場合はINPUT_GETをINPUT_PSTにする $str = filter_input(INPUT_GET, 'data2'); if ( $str===FALSE ) { $err='配列?'; }elseif ( $str===NULL ) { $err='未受信'; } //(c.)出力 if($err){ echo '

'.$err.'

'; }else{ //htmlページに出力する場合はエスケープ処理してから $str=htmlspecialchars($str,ENT_QUOTES,'UTF-8'); echo '

入力値は「'.$str.'」です

'; } echo '';
==== 説明 ==== dokuwikiで実行する場合はページ中に「%%~~NOCACHE~~%%」を記入しキャッシュ機能をOFFにしてください。 (a.)と(c.)は前項と同じです。 **(b.)フォームを受信** GETで送信した場合は「%%filter_input(INPUT_GET,'name');%%」で、POSTで送信した場合「%%filter_input(INPUT_POST,'name');%%」で受け取れます。 配列を受信する場合、 ''FILTER_REQUIRE_ARRAY'' オプションを使います。 $str=filter_input(INPUT_GET, 'data2', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY); 文字列と配列の両方に対応したい場合は下記のように複雑になります。 $str = filter_input(INPUT_GET, 'data2'); if ( $str===FALSE ) { //文字列受信に失敗したら配列受信を試す $str=filter_input(INPUT_GET, 'data2', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY); if ( $str===FALSE ) { $err='フィルターエラー'; } }elseif ( $str===NULL ) { $err='未受信'; }