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

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

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

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

Q&A

解決済

2回答

9949閲覧

php の入力フォームで入力画面及び確認画面、完了画面を同一ファイルで実装する際のURL、HTMLの表示方法って。。

singlestroke

総合スコア68

PHP

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

0グッド

1クリップ

投稿2016/04/01 14:56

php で、入力画面とバリデーションエラー画面、確認画面、完了画面を同一ファイルで記述できないかと思い、下記のようなものを書いてみました。

php

1<?php 2if ( isset($_POST["submit"]) ) { 3 4 $errors = array(); 5 6 if ( $_POST["name"] == "" ) { $errors["name"] = "名前が未入力"; } 7 8 if ( !$errors ) { 9 $name = $_POST["name"]; 10 $flag_send = 1; //正常終了フラグ 11 } 12} 13 14print <<< EOM 15<!DOCTYPE html> 16<html lang="ja"> 17 <head> 18 <meta charset="utf-8"> 19 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 20 <meta name="viewport" content="width=device-width, initial-scale=1"> 21 <title>申込フォーム</title> 22 23 <!-- Bootstrap --> 24 <link href="css/bootstrap.min.css" rel="stylesheet"> 25 26 <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> 27 <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> 28 <!--[if lt IE 9]> 29 <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> 30 <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> 31 <![endif]--> 32 </head> 33 <body> 34<div class="container"> 35 36<h1>申込フォーム</h1> 37EOM; 38 39if ( !isset($flag_send) ) { 40 print '<form method="post" action="" class="form-horizontal">'; 41 print '<div class="form-group">'; 42 print '<label class="col-sm-2 control-label" for="name">名前</label>'; 43 print '<div class="col-sm-3">'; 44 print '<input class="form-control" type="text" id="name" name="name" value="'.$_POST["name"].'" />'; 45 if ( isset($errors["name"]) ) { 46 print "<p class=\"text-danger\">".$errors["name"]."</p>"; 47 } 48 print '</div>'; 49 print '</div>'; 50 print '<div class="text-center"><input type="submit" name="submit" class="btn btn-default" value="確認"></div>'; 51 print '</form>'; 52} else { 53 print "処理完了"; 54} 55?>

下記2点、お伺いしたいです。

1)このような場合、確認画面、完了画面のURLをパラメータ表示などさせて判別できるようにするにはどのようにしたらよいのでしょうか。

2)print を頻繁に使用してHTMLを表示させていますが、あまりコードとして綺麗であるとは感じません。何か他にうまい記述方法などありますでしょうか。

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

完了画面だけページを分けるべきですね.

html

1<?php 2 3// POSTパラメータを限定して,確実に文字列として $p に代入する 4// 未定義の場合と不正に配列で送信された場合は空文字列になる 5foreach (['submit', 'name'] as $key) { 6 $p[$key] = (string)filter_input(INPUT_POST, $key); 7} 8 9// 送信ボタンが押されたとき 10if ($p['submit']) { 11 // 名前をチェック 12 if ($p['name'] === '') { 13 $e['name'] = '名前が未入力'; 14 } 15 // エラーが1つもなければここを実行して終了 16 if (empty($e)) { 17 // 「303 See Others」で/thanks.htmlに遷移させる 18 header('Location: /thanks.html', true, 303); 19 exit; 20 } 21 // 「400 Bad Request」 22 http_response_code(400); 23} 24 25/** 26 * HTML特殊文字をエスケープする関数 27 * XSS攻撃を防ぐために必ず <?=h($var)> のイディオムで使う 28 */ 29function h($str) { 30 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 31} 32 33// 文字コードの指定 34// <meta charset="UTF-8"> でもいいけどHTTPヘッダで指定できる場合はこちらのほうが望ましい 35header('Content-Type: text/html; charset=UTF-8'); 36 37?> 38<!DOCTYPE html> 39<html lang="ja"> 40 <head> 41 <title>申込フォーム</title> 42 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 43 <meta name="viewport" content="width=device-width, initial-scale=1"> 44 <link href="css/bootstrap.min.css" rel="stylesheet"> 45 </head> 46 <body> 47 <div class="container"> 48 <h1>申込フォーム</h1> 49 <form method="post" action="" class="form-horizontal"> 50 <div class="form-group"> 51 <label class="col-sm-2 control-label" for="name">名前</label> 52 <div class="col-sm-3"> 53 <input class="form-control" type="text" id="name" name="name" value="<?=h($p['name'])?>"> 54<?php if (isset($e['name'])): ?> 55 <p class="text-danger"><?=h($e['name'])?></p> 56<?php endif; ?> 57 </div> 58 </div> 59 <div class="text-center"> 60 <input type="submit" name="submit" class="btn btn-default" value="確認"> 61 </div> 62 </form> 63 </div> 64 </body> 65</html>

投稿2016/04/01 15:22

編集2016/04/01 15:25
mpyw

総合スコア5223

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

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

singlestroke

2016/04/02 00:59

下記の部分ですが、 ------------------------------------------------------------------------ // POSTパラメータを限定して,確実に文字列として $p に代入する // 未定義の場合と不正に配列で送信された場合は空文字列になる foreach (['submit', 'name'] as $key) { $p[$key] = (string)filter_input(INPUT_POST, $key); } ------------------------------------------------------------------------ 入力項目が複数になったら下記のようになるのでしょうか。 foreach ( ['submit', 'uname', 'mail', 'message'] as $key ) { $p[$key] = (string) filter_input ( INPUT_POST, $key ); } $p を print_r してみると余分に処理が回っている感じがするのですが。。。
mpyw

2016/04/02 13:18

>> 入力項目が複数になったら下記のようになるのでしょうか。 そうですね. >> $p を print_r してみると余分に処理が回っている感じがするのですが。。。 再表示の都合上,常にこの処理は行っておいたほうが利便性が高いです.さもなくば print '<input class="form-control" type="text" id="name" name="name" value="'.$_POST["name"].'" />'; こういう部分で $_POST["name"] を存在確認(と文字列であることの確認)無しに使ってしまうとエラーセーフではなくなります.
guest

0

私ならまず、何をしたいのか?を仕様書に書く。

1ぺーじで処理、確認、実行を行い表示切り替えしたいならページを読み込んだ際に半別処理する事になるので条件分岐を書けば良いだけ。

その前にコメントアウトでセクション毎に逐一書いてくれ!!目が悪くなるし見る気すらしない!

投稿2016/04/21 16:54

KatsukiSugiura

総合スコア335

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問