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

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

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

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

Q&A

解決済

2回答

758閲覧

PHPのPOSTについての課題

heysuky

総合スコア21

PHP

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

0グッド

0クリップ

投稿2019/03/07 14:48

編集2019/03/09 06:46

「ユーザが選択した値をPOSTで受け取って表示するプログラムを作成する」という課題なのですが、以下のコードで合っているかどうか、またもし間違っているなら間違っている箇所や改善点などをお聞きしたく質問してみました。
inputでボックスを作って、そこから得た情報をページの上に表示するという内容です。
具体的にやったのはHTML内で値を送ってPHPで受け取り、それをエスケープ(htmlspecialchars)して、内容があった場合にのみ上部に表示させるということをしました。htmlspecialcharsは変数に入れない方がいいというアドバイスを受けましたが、この場合他の書き方がわからなくてこれでいいのかという疑問と、値として得た名前を表示するときに、if ($my_name) という書き方でいいのかという疑問があります。それについてはコード内にコメントで書いてみました。
PHPの勉強始めたてで変な箇所あるかもしれませんがぜひよろしくお願い致します。

PHP

1<?php 2$my_name = ''; 3$gender = ''; 4$mail = ''; 5if (isset($_POST['my_name']) === TRUE && $_POST['my_name'] !== '' ) { 6 $my_name = htmlspecialchars($_POST['my_name'],ENT_QUOTES,'UTF-8'); 7} 8if (isset($_POST['gender']) === TRUE) { 9 $gender = htmlspecialchars($_POST['gender'],ENT_QUOTES,'UTF-8'); 10} 11if (isset($_POST['mail']) === TRUE) { 12 $mail = htmlspecialchars($_POST['mail'],ENT_QUOTES,'UTF-8'); 13} 14?> 15<!DOCTYPE html> 16<html lang="ja"> 17 <head> 18 <meta charset="UTF-8"> 19 <title></title> 20 </head> 21 <body> 22 <?php if ($my_name) { ?>  //ここが合っているかどうか気になります。かっこの中は$my_nameでよかったでしょうか? 23 <p>入力した名前: <?php print $my_name; ?></p> 24 <?php } ?> 25 <?php if ($gender === 'man' || $gender === 'woman') { ?> 26 <p>選択した性別: <?php print $gender; ?></p> 27 <?php } ?> 28 <?php if ($mail === 'OK') { ?> 29 <p>メールを受け取るかを表示: <?php print $mail; ?></p> 30 <?php } ?> 31 <form method="post"> 32 <p><label>お名前: <input id="my_name" type="text" name="my_name"></label></p> 33 <label>性別: <input type="radio" name="gender" value="man"></label> 34 <input type="radio" name="gender" value="woman">35 <input type="checkbox" name="mail" value="OK">お知らせメールを受け取る 36 <p><input type="submit" value="送信"></p> 37 </form> 38 </body> 39</html>

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

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

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

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

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

m.ts10806

2019/03/07 21:19

課題である、デバッグ依頼、丸投げ と非推奨だらけの内容(質問になってません)なので、何が分からないのか何に詰まっているのか問題を明確に具体的に書くと共に自身がその問題に対して取り組んだ内容もきちんと書いてください。 ひとつのことを実現するために、手法やプロセスは1つではありません。何を実現しようとしているかをコードだけで読み取るのは熟練者でも難しいです。POST云々はただの実現手段です。このプログラムが何を実現しようとしているものか、目的や仕様をきちんと書いてください。
m.ts10806

2019/03/07 21:21

あと「初心者アイコン」つけてください。だからって免罪符になるとは限りませんが、回答する方もある程度考慮はできますので。
heysuky

2019/03/09 06:48

申し訳ありません。確かにちょっと言葉が不足していました。あまり専門用語をまだわかっていないので稚拙な言葉になってしまっているかもしれませんが、更新しました。 初心者マークもつけました。アドバイスありがとうございます。
guest

回答2

0

ベストアンサー

ひとつ気になるところ。

$my_name = ''; $gender = ''; $mail = '';

これらの変数が、web表示だけに使う変数であれば、

$my_name = htmlspecialchars($_POST['my_name'],ENT_QUOTES,'UTF-8');

などとして htmlspecialchars() で加工するのはアリなのですが、
データベースに保存したりファイルに書き出す場合には
web表示用に加工したデータを記録するのは良くないです。

PHP: htmlspecialchars - Manual
POSTされた文字列にもしも「&」が含まれていれば、
web表示用に「&」に置き換えられたりします。
データベースに「&」のまま記録されれば
例えば「&」を含む文字列を検索するクエリーとかしやすいですが、
もしも「&」で保存されている前提だとすると、
そういうクエリーも余計な工夫をしないとできなくなります。

PHP で h() を書くなら一緒に echo しよう。 - こせきの技術日記

そのため、こういう賢い工夫をして、html出力直前に加工して出力します。

そうでなくても、いつもいつも

$my_name = htmlspecialchars($_POST['my_name'],ENT_QUOTES,'UTF-8');

が出てくるとコードを読む側としてうるさく感じるので。

もう一つ。
PHP: filter_input - Manual
これを使って

$my_name = filter_input(INPUT_POST, 'my_name');

などとすると、POST受信していなければ空文字列になるのでコードを削減できます。
しかし、マイルール的に変数に初期値を入れておきたいときは、このあとにから文字列だった場合の処理を加えて、

$my_name = filter_input(INPUT_POST, 'my_name'); if ($my_name === '') { $my_name = '(未入力)'; }

みたいになるでしょうか。

投稿2019/03/08 01:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

heysuky

2019/03/09 07:47 編集

>PHP で h() を書くなら一緒に echo しよう。 - こせきの技術日記 こちら読ませて頂きました。以前にも言われたのですが変数にhtmlspecialcharsを入れるのは良くないのでした。。 言われたことを調べていて疑問が出てきたのですが、そもそもissetは引数に値が入っていればtrueを返す、ということは if(isset() === TRUE) { とする必要はないのでしょうか? コードとしては、 ``` if (isset($_POST['my_name']) { ``` だけでよかったのでしょうか? また、filter_inputも初めて聞いて調べてみたのですが、issetの代わりに使えるものという認識で合っているでしょうか。 初期値は、変数に何も入ってない場合に「Notice: Undefined variable」というエラーが出てしまうので初期値を入れるようにしていましたが、m6uさんのアドバイス通りに書き直してみたら初期値を入れるコードを書かなくてもできているのですが、なぜできているのかは正直よくわかっていないです。filter_inputは変数に値が入っていない場合はちゃんと空として認識しているから初期値を設定する必要がない、とかでしょうか。 つまり、m6uさんが書き足してくださった ``` if ($my_name === '') { $my_name = '(未入力)'; } ``` 部分なしでもエラーが出なかったのです。初期値設定は必要なくなるのでしょうか? また、以下書き直したコードなのですが、この書き方で合っていますか?コードの上のPHP部分です。 ``` <?php function h($str) { echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } $my_name = filter_input(INPUT_POST, 'my_name'); $gender = filter_input(INPUT_POST, 'gender'); $mail = filter_input(INPUT_POST, 'mail'); ?> ``` 細かい確認なのですが、h($str)は、htmlでは ``` <?php h($my_name); ?> ``` という書き方で合っていますか?一応これで動いています。
退会済みユーザー

退会済みユーザー

2019/03/11 03:41

h関数については、それでOK。 filter_input()使うと変数の初期化がいらなくなりますが、 全くPOST受信していない場合(URL直でのアクセスなど)と POST受信しているけど一部足りないパラメータがあった場合の区別をしたい場合は、 より丁寧なコードを書かないといけません。 ($_SERVER['REQUEST_METHOD']が'POST'なのかどうか、とか。)
heysuky

2019/03/11 09:39

回答ありがとうございます。 ちょっとまだ$_GETと$_POSTしか使ったことがないのでややこしくて理解が足りてない部分もあるのですが、そうなるとおとなしくissetを使った方がいい場合もありそうですね。filter_inputを使う場合はその辺の詳しい書き方をまた随時学んでいきます。ご丁寧にありがとうございました。
guest

0

合っているかどうかは実際に動かしてみたらわかります。
コメントされた部分は$my_nameに文字列が入っていればtrueとなるので大丈夫ですが、それより

php

1if (isset($_POST['my_name']) === TRUE ...

の比較演算子が問題です。
===は型まで比較するので、formから値の入った状態でPOST送信されてきた場合でも$my_name も $gender も $mail も常に空になってしまいますよ。

追記
比較演算子の件は私のまったくの勘違いです。無視してください。

投稿2019/03/07 15:15

編集2019/03/07 21:38
cerfweb

総合スコア1899

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

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

m.ts10806

2019/03/07 21:26

私が低評価つけたわけではないですが、この式での===の比較対象はisset()の評価結果なので、送信されてれば定義されてtrueになります。
cerfweb

2019/03/07 21:34

確かにおっしゃる通りです。お恥ずかしい。。。
heysuky

2019/03/09 06:39

遅くなってしまいました。。それでも回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問