🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

1146閲覧

PHPで可変的な部分を与える方法

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/12/29 08:02

編集2019/12/30 11:11

前提・実現したいこと

(例)PHPで簡単なお問い合わせフォームなシステムを作っています。
前回の質問の続きです。現在、前回のご回答通りに固定情報で静的HTMLを作ってその後にPHPから得られる情報を当てはめていくという作業を行なっています。

作成したプロトタイプ

##PHPで可変的な部分を与える方法
PHPで可変的な部分を与える方法なのですが、以下のコードのように与えて良いのでしょうか?
それともこれは無理やりな方法なのでしょうか?

php

1<?php 2 $nickname=filter_input(INPUT_POST,"nickname"); 3 $email=filter_input(INPUT_POST,"email"); 4 $content=filter_input(INPUT_POST,"content"); 5 6 $nickname=htmlspecialchars($nickname); 7 $email=htmlspecialchars($email); 8 $content=htmlspecialchars($content); 9?> 10<!DOCTYPE html> 11<html lang="ja"> 12<head> 13 <meta charset="UTF-8"> 14 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 15 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 16 <title>お問い合わせフォーム</title> 17 <link rel="stylesheet" href="css/check.css"> 18</head> 19<body> 20 <!-- 入力 山田太郎 yamada@gmail.com 大変よかったです --> 21 <h1>お問い合わせ内容(確認)</h1> 22 <h3>お問い合わせありがとうございます。 23 <?php if( $nickname==''||$email==''||$content=='') 24 { 25 print'<h3>入力内容に不足がない事を確認してください。</h3>'; 26 } 27 else 28 { 29 print'下記に問題がない事を確認して送信してください。'; 30 } 31 ?> 32 <table align="center" width="600"> 33 <thead> 34 <tr> 35 <td>項目</td> 36 <td>入力内容</td> 37 </tr> 38 </thead> 39 <tr> 40 <td>名前</td> 41 <td><?php if($nickname=="") 42 { 43 print"ニックネームが入力されていません。<br>"; 44 } 45 else 46 { 47 print $nickname; 48 print"様"; 49 print"<br>"; 50 }?></td> 51 </tr> 52 <tr> 53 <td>メールアドレス</td> 54 <td><?php if($email=="") 55 { 56 print"メールアドレスが入力されていません。<br>"; 57 } 58 else 59 { 60 print$email; 61 print"<br>"; 62 } ?></td> 63 </tr> 64 <tr> 65 <td>お問い合わせ内容</td> 66 <td width="300px;"><?php if($content=="") 67{ 68 print"ご意見が入力されていません。<br>"; 69} 70else 71{ 72 print $content; 73} ?></td> 74 </tr> 75 </table> 76 77 <?php 78 if( $nickname==''||$email==''||$content=='') 79 { 80 print'<form>'; 81 // print'<input type="button" onclick="history.back()" value="戻る" class="btn">'; 82 print'<button id="go-back" value="戻る" >戻る</button>'; 83 print'</form>'; 84 } 85 else 86 { 87 print'<form method="post" action="thanks.php">'; 88 print '<input name="nickname" type="hidden" value="'.$nickname.'">'; 89 print '<input name="email" type="hidden" value="'.$email.'">'; 90 print '<input name="content" type="hidden" value="'.$content.'">'; 91 92 // print'<input type="button" onclick="history.back()" value="戻る" class="btn">'; 93 print'<button onclick="go-back" value="戻る" >戻る</button>'; 94 // print'<input type="submit" value="OK">'; 95 print'<button type="submit">OK</button>'; 96 print"</form>"; 97 } 98 ?> 99 100 <script> 101 window.onload = function(e) { 102 document.getElementById('go-back').addEventListener('click', e => { 103 window.history.back(); 104 }) 105} 106 </script> 107</body> 108</html>

又、inputタグからbuttonタグに変更し、「戻るボタン」を押せば戻る様にしたいのですが、buttonタグではonclick="history.back()" が使えないので、以下の様にしたのですが、意図しない結果となってしまいました。

php

1 print'<button onclick="go-back" value="戻る" >戻る</button>';

javascript

1 window.onload = function(e) { 2 document.getElementById('go-back').addEventListener('click', e => { 3 window.history.back(); 4 }) 5}

修正: 5:13
エラーはどうにか表示されなくなったのですが、ページの入力事項が消されてしまい、前のページにデータを保持したまま戻すことができません。

##ヒアドキュメント

1度見様見真似で作成したのですが、echo <<{$checkname} EOT;と表示されています。

php

1<?php 2 $nickname=filter_input(INPUT_POST,"nickname"); 3 4 $nickname=htmlspecialchars($nickname); 5 6 $checkname = ""; 7 if($nickname=="") 8 { 9 $checkname = 'ニックネームが入力されていません。<br>'; 10 } 11 else 12 { 13 $checkname = $nickname; 14 "様<br>"; 15 } 16 ?> 17 18<tr> 19 <td>項目</td> 20 <td>入力内容</td> 21 </tr> 22 </thead> 23 <tr> 24 <td>名前</td> 25 echo <<<EOT 26 <td>{$checkname}</td> 27EOT; 28 </tr>

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

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

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

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

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

m.ts10806

2019/12/29 09:20

>buttonタグではonclick="history.back()" が使えない あれ。使えませんでしたっけ。type=buttonにすればいいだけでは?
退会済みユーザー

退会済みユーザー

2019/12/29 17:38

回答ありがとうございます。 >あれ。使えませんでしたっけ。type=buttonにすればいいだけでは? 確認したところ、使えました。ありがとうございます。
guest

回答2

0

ベストアンサー

可読性の問題だけを現質問としているなら「非常に悪い」と言わざるを得ませんが、
それを度外視すれば、「想定通りの結果が出てるんだったら別にいいんじゃない?」くらいです。
強いてなら「テンプレートとロジックはわけよう」くらいでしょうか。

html内に<?phpタグがあってその中でifがあって・・・というのはお世辞にも見やすいとは言えません。

すごく簡単なコードで比較してみると良いです。
下記2つは出力結果は同じです。

php

1<?php 2$color_code = 1; 3?> 4<span style="color:<?php 5if($color_code === 1){ 6 echo "red"; 7}else{ 8 echo "blue"; 9} 10?>;">test</span> 11

php

1<?php 2$color_code = 1; 3$color = ""; 4if($color_code === 1){ 5 $color = "red"; 6}else{ 7 $color = "blue"; 8} 9echo <<<EOF 10<span style="color:{$color};">test</span> 11EOF; 12

純粋に「良いか悪いか」で言われると「結果が同じだから構わない」です。
別にそれで動作しないわけでもないはずなので。
「良いかどうか」を聞くのであれば、観点を明確にされた方が良いかと思います。

今回は前の質問から見ていておそらく可読性の良し悪しになりそうなのでエスパー的にしていますが、
もしこれが違えば私の回答は無駄になることになるので、「どこをどう見てほしいか」も
質問に具体的に書くようにしてください。

あと、

ページの入力事項が消されてしまい、前のページにデータを保持したまま戻すことができません。

いずれにしてもブラウザバックに頼るのはよろしくありません。
JavaScriptなので、ブラウザによって動作が違ってくる可能性もあります。
例えばPHP側でセッションに入れるなどして、「画面遷移」として扱い、きちんとコントロールするようにしてください。

投稿2019/12/29 11:40

m.ts10806

総合スコア80875

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

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

kyoya0819

2019/12/30 09:59 編集

補足ですが出力結果は同じですが 2 の方が速いという結果が散見されます。
m.ts10806

2019/12/29 11:51

それこそ「観点」ですね。 速さを気にするのはメモリとか全体的なパフォーマンスを追い求めるようになってからだと思いますし、 その前にもっとできることを全てやりつくして、「さらにもう1歩上を目指すなら」という段階かなと。 可読性重視ならヒアドキュメントよりテンプレートエンジン入れてほしいですし、 がりがり生で書くのではなくフレームワーク入れてほしいのが本音ですけど、 当然のことながらフレームワーク+テンプレートエンジンは大抵ガリガリ生で書くよりは遅いです。
退会済みユーザー

退会済みユーザー

2019/12/30 01:07 編集

ご回答ありがとうございます。 >今回は前の質問から見ていておそらく可読性の良し悪しになりそうなのでエスパー的にしていますが、 PHPでかかれたサイトのコードはPHPでは見れませんよね。 (参考: https://teratail.com/questions/97870) htmlやcssではコードを表示することができ色々なサイトのコードを見ることで一般的にはこの様な記述方法があるのかと認識することができたのですが、PHPではできない為、一般的にはどの様に記述するのかをお尋ねしたかったです。 >がりがり生で書くのではなくフレームワーク入れてほしいのが本音ですけど、 当然のことながらフレームワーク+テンプレートエンジンは大抵ガリガリ生で書くよりは遅いです。 又、コメントにもフレームワークとあるのですが将来Laravelを使用していきたいなと思いますので、フレームワークとの整合性といった観点ではどうなるのかが疑問となる観点です。 >がりがり生で書くのではなくフレームワーク入れてほしいのが本音ですけど、 フレームワークとあったので質問したいのですが、フレームワーク(視野に入れているのは、Laravel, CakePHPなど)はある程度PHPを理解した上で導入する方がやはり良いのでしょうか? ここで言うある程度とは少し曖昧な表現なのですが。。 以前、m.ts10806さんにlaravelについて教えてもらった際(記事が見つかり次第URLを提示します。) laravelは、web職人の為のPHPのフレームワークだお聞きし、難易度は高いようだったのですが、どのタイミングで学習していいのかも教えてもえると幸いです。(文章だけで、判断する事は難しいとは思いますが。。)
m.ts10806

2019/12/29 21:14

急に呼び捨てですか。
m.ts10806

2019/12/29 21:57 編集

>(参考: https://teratail.com/questions/97870) 細かいですが、半角英数は全部結合されるのでURLおきたい場合は前後スペースを入れるか、URLだけを入れる行を作ってください(後述参考)。 >PHPでかかれたサイトのコードはPHPでは見れませんよね。 えっと、それを私に言いますか?(一応teratail内ではPHPタグのランク2位らしいですよ。) 今回言っている「可読性」はあくまで「開発者」の観点です。 もう1つ言えば「メンテナンス性」や「可用性」も含めて良いかもしれません。 メンテナンスや保守が未来永劫発生しないシステムってほぼないので、 じゃあメンテナンスしようってなったときに開発者側が気にするかどうかを言っています。 htmlやCSSと仰っていますが、一般利用者はコードのことを気にすることはありません。 動けばそれでいいので。 PHP側のコードはもちろん気にすることはないですし、PHPで作られているかどうかも関係ないですね。 さて。 >一般的にはどの様に記述するのかをお尋ねしたかったです。 そういうのは「ない」のが実際です。 既に回答に書いてあるように、「想定通りの結果が出てるんだったら別にいいんじゃない?」だからです。 どう書いていても動けば良いのです。 1つの結果を出すためのコードは1つではないのはご存知かと思いますが、 サーバーサイドの言語はhtml、CSSよりもその「1つではない」の種類が多いです。 それだけに「一般的な」というのはあまり適切な求め方ではないですね。 切り捨てるわけではないので、後学のためにヒントをだしておくと、 「リーダブルコード」はざっとでも読んでおいた方が良いでしょう。 https://employment.en-japan.com/engineerhub/entry/2017/09/26/110000 エンジニアとして就職した場合、新卒が先輩にすすめられることが多い書籍です。 >又、コメントにもフレームワークとあるのですが将来Laravelを使用していきたいなと思いますので、フレームワークとの整合性といった観点ではどうなるのかが疑問となる観点です。 ちょっと意味が分からないのですけど(整合性と言うのは具体的に何のことを言ってるのか) そもそもフレームワークを利用するということは「そのフレームワークのルールにのっとってコードを書く」ことになるので、整合性も何もほぼ初めから書き直しです。 ルールに則って書かないならフレームワークを利用するメリットなしなので(たまにメリット皆無のオレオレコードをフレームワークで書いている人がいて悲しくなる) フレームワーク使うならそこは「動けばいい」というのと話は違ってきます。 読みづらいコードを書く人は大抵フレームワークを使う段階ではない人です。 >フレームワークとあったので質問したいのですが、フレームワーク(視野に入れているのは、Laravel, CakePHPなど)はある程度PHPを理解した上で導入する方がやはり良いのでしょうか? ここで言うある程度とは少し曖昧な表現なのですが。。 当然です。結局はPHPで書かれているものです。 何かあった時にネットでそれっぽい記事を探すのではなく、 フレームワークのコアソースを読み解いていく力も必要となります。 もちろん公式のドキュメントをきちんと読むのはPHPマニュアルの時と同じですし、 「ルールに則って書く」ことになるので、そこに乗せられるように自身で考える力も必要になります。 >laravelは、web職人の為のPHPのフレームワークだお聞きし、難易度は高いようだったのですが、どのタイミングで学習していいのかも教えてもえると幸いです。(文章だけで、判断する事は難しいとは思いますが。。) 各所で書いていますが、Laravelは他のPHPフレームワークに比べて、求められるPHPの知識技術経験は高いです。それは後発のフレームワークだからというのもあります(実際に別のフレームワーク「Symfony」を内部的に利用しています) バージョン5以降は、フレームワークとして基礎となる規約を設けつつ、自由な構造での組み方が可能となっているからですね。 自由であるということはそれだけ自己責任の割合が大きくなるということ。 スパゲッティコードをスパゲッティコードだとツッコミを入れることができて、リーダブルコードに直せるくらいの力は必要でしょう。 もちろん自身でデバッグしたり、ある程度の問題解決能力は必要です。 それがないままteratailに質問しに来ているのが要は「使える実力が伴ってないのに背伸びしすぎた」人です。 あと、私が回答に貼ったURLの元文章は読みました? https://qiita.com/tadsan/items/fb496e450fc27c8c4494 この記事を「うんうん分かる分かる」と言えるくらいのスキルは必要と思います。 「フレームワークを使え」という項目がありますが「なぜそう言ってるのか」と論理的に理解している必要もあると思います。 まあ、まず自分でしっかりオブジェクト指向使ってオレオレフレームワーク作ってみてからがスタートでしょうね。 別に並行して学ぶのは不可ではありませんが、「なんか流行ってるから」「みんながすすめるから」で 手を出してなんとかなることは少なく、結局基礎となるPHPの学習に戻ってくることになります。非効率ですね。 teratailで半端な状態で手を出した人はほぼ必ず「もっとPHPの基礎を身につけてからの方が」と指摘をされている現状があります。 (これはどのフレームワークにも言えること。シンタックスエラーのことを聞いてるレベルでなぜフレームワークに入ったんだ?という質問者が非常に多い) まずは、PHPの問題なのか、フレームワーク固有の問題なのかをきちんと切り分けられるレベルを目指しましょう。 まあフレームワークを入れずとも本題の「テンプレートとロジックは分けろ」部分は可能です。 フレームワークよりもテンプレートエンジンを入れてみると良いです。これだけで充分分けられます。 SmartyとかTwigとかが代表的なPHPテンプレートエンジンです。 テンプレートエンジンでもある程度ロジックは書けるようにはなってますが、あまり好ましくはないです。
退会済みユーザー

退会済みユーザー

2019/12/30 01:12

あ、すいません。 普段名前はコピペでしてるのですが、抜けていましたね。訂正させていただきます
退会済みユーザー

退会済みユーザー

2019/12/30 02:22

>サーバーサイドの言語はhtml、CSSよりもその「1つではない」の種類が多いです。 それだけに「一般的な」というのはあまり適切な求め方ではないですね。 >「リーダブルコード」はざっとでも読んでおいた方が良いでしょう。 ありがとうございます。提示してもらった書籍を是非読んで参考にしたいと思います。 >ちょっと意味が分からないのですけど(整合性と言うのは具体的に何のことを言ってるのか) フレームワークというものを少し誤解していた様です。 >あと、私が回答に貼ったURLの元文章は読みました? 拝見しました。画面を描画する機能とそれ以外は明確に分けるなどのロジックを分けた方が可読性からの観点からも非常に分ける重要性を理解しました。 フレームワークよりもテンプレートエンジンを入れてみると良いです。これだけで充分分けられます。 >テンプレートエンジンについては何も知らないのでこれから学習していきたいと思います。
退会済みユーザー

退会済みユーザー

2019/12/30 06:47 編集

提示してもらったコードなのですが、ヒアドキュメントについて下記サイトをみてもわからないのですが、参考サイト等ありますか? https://www.php.net/manual/ja/language.types.string.php
m.ts10806

2019/12/30 04:02

下記サイトと言われてもそれはローカルに構築されたWebサイトのローカルアクセスURLなのでこちらで確認しようがありません。
退会済みユーザー

退会済みユーザー

2019/12/30 06:48

あ、訂正しました。
m.ts10806

2019/12/30 07:57

何を知りたくて何が分からないんでしょう。 あと、既に解決されてる状態で追加質問されても、とは感じています。
退会済みユーザー

退会済みユーザー

2019/12/30 08:20

すいません。
m.ts10806

2019/12/30 09:10

怒っているわけでも謝ってほしいわけでもなく どう進めるつもりなのかハッキリしてほしいだけです。 続けるのでしたら解決済みを受付中に戻すべきですし、 本件本当に解決としているのでしたらもう少し自身で試してみた上で 解決しなければ別質問としてください。
退会済みユーザー

退会済みユーザー

2019/12/30 10:52

m.ts10806さんの提示してもらったコードでテンプレートとロジックを分ける際にどちらのコードが見やすいかを簡単なコードを提示してもらい比較して可読性が分けた方が良いというところまで分かり、1度ベストアンサーにさせていただいたのですが、ロジックと分ける際に行う方法(おそらくm.ts10806さんが使った方法は私が調べた限りヒアドキュメントですよね?ヒアドキュメントについては私は何も知らないので間違っていたらすいません。)の記述方法が分かりません。 先ほど、PHPマニュアルで調べて読んだのですが、わからず・・・ 是非、簡単に教えてもらえば幸いです。
退会済みユーザー

退会済みユーザー

2019/12/30 11:11

一度見様見真似で作成しました。 質問文に追加情報として記載しましたので、お確かめください。
退会済みユーザー

退会済みユーザー

2019/12/30 13:43

うまくいきました・ ありがとうございます。
kyoya0819

2019/12/30 14:56

どのようにうまく行ったかを書いていただくと、他の方の参考になるかも知れないので、御追記よろしくお願いします。
退会済みユーザー

退会済みユーザー

2019/12/30 19:35

了解です。
m.ts10806

2019/12/30 19:47 編集

変数出力するだけならヒアドキュメントにする意味ないですね。 何度も言っているように、1つの結果を出すのに手段は1つではないので、 かといってあまり効果のない使い方をしてもいいというと、更に可読性が悪くなるだけですし。 ヒアドキュメントはある程度まとまった文字列を一気に出力する際に”PHPコード自体の”可読性がよくなるものです。 結果は同じなので別に1列ずつインデントつけて改行コードも後ろにつけてechoしてもいいし echo " <tr>".PHP_EOL; echo " <td>".PHP_EOL; echo " ".$test.PHP_EOL; echo " </td>".PHP_EOL; echo " </tr>".PHP_EOL; ヒアドキュメントじゃなくクォーテーション内で改行付けてもいいし、 echo " <tr> <td> {$test} </td> </tr>"; シングルクォーテーションでもいいし echo ' <tr> <td> '.$test.' </td> </tr>'; 全て連結してもいい echo " <tr>".PHP_EOL. " <td>".PHP_EOL. " ".$test.PHP_EOL." " </td>".PHP_EOL. " </tr>".PHP_EOL; 「こうやらなきゃいけない」というのはなくて、最初から回答にあるように、 ”純粋に「良いか悪いか」で言われると「結果が同じだから構わない」”です。 現場にルールがあればそれに準じるだけ。 なければ既に組まれているコードがあればそれに雰囲気を合わせるだけ。 何もなければ自分の中で可読性が良いと思うやり方を選ぶだけ(もしそれで可読性が悪いとレビュー指摘くればその場で覚えれば良いので)
退会済みユーザー

退会済みユーザー

2019/12/30 22:21 編集

私が、回答したものだと変数で行なっているのですが、関数でも良いのでは無いかと思います。 変数と関数どちらかあまりこの際に区別できていないです。 function cheackname() { #処理内容 } <html> <body> <p><?php cheackname() ?> </body> </html>
退会済みユーザー

退会済みユーザー

2019/12/30 22:27 編集

>「こうやらなきゃいけない」というのはなくて、最初から回答にあるように、 ”純粋に「良いか悪いか」で言われると「結果が同じだから構わない」”です。 結果が同じだけれども、沢山のコードがある訳ですから、どのコードが良いのか。。 などと考えてしまっています。 >現場にルールがあればそれに準じるだけ。 了解です。その際に、直せと言われたら直していくスタイルでいきたいと思います 今は、完全に独学なのでルールがなく重ね重ね聞いてしまいましたが、ありがとうございます。
guest

0

処理を定数として記述し、html内では変数を呼び出す処理のみを記述しました。

php

1<?php 2$checkname = ("処理内容") 3?> 4<html> 5<body> 6<p><?php echo $checkname; ?></p> 7</body> 8</html>

投稿2019/12/30 19:38

編集2020/01/05 13:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/05 13:31

訂正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問