• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件に該当した時にだけhtmlを出力するいい方法)

条件に該当した時にだけhtmlを出力するいい方法

このQ&Aのポイント
  • 条件に該当した場合にのみ、スマートな方法でHTMLを出力するにはどうすれば良いでしょうか?
  • 過去のプロジェクトで同様の問題に直面した方は、どのような解決策を見つけましたか?
  • タイトルに「条件に該当した時にだけhtmlを出力するいい方法」と記述しました。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

「制御構造に関する別の構文」と「echo短縮構文」を利用してこういうのはどうでしょうか。Smartyを使えるなら使うべきだと思いますが、そういったものが無くてもPurePHPだけでスマートに書ける方法として私は愛用しています。 制御構造に関する別の構文 http://www.php.net/manual/ja/control-structures.alternative-syntax.php echo http://www.php.net/manual/ja/function.echo.php (備考) $_GET, $_POSTなどを受け取る際の処理 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea <?php function h($str) {  return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } $name = filter_input(INPUT_GET, 'name'); if ($name !== null) {  if ($name == '') { /* FALSE を含めたいためわざと === ではなく == を使用 */   $msg = '名前は1文字以上入力してください';  } else {   $msg = "こんにちは、{$name}さん";  } } header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html> <body> <?php if (isset($msg)): ?>  <p><?=h($msg)?></p> <?php endif; ?>  <form method="get" action="">   名前: <input type="text" name="name" value="<?=h($name)?>">   <input type="submit" value="送信">  </form> </body> </html>

pringlez
質問者

お礼

あ。私が求めていたのはこれです。 # <?php if (isset($msg)): ?> #  <p><?=h($msg)?></p> # <?php endif; ?> PHP開発経験が無く個人で作っているので、人に聞くことも人のソースを見ることもできないので苦労していたのですが、助かりました。あらためて見ると普通のことなのに…。 あと、h関数などは実践的で参考になりました。※JavaScriptでjQueryなどのライブラリを使っていないときに、「document.getElementById」を「$」に書き換えるみたいに流行ってるんですかね? また「(備考) $_GET, $_POSTなどを受け取る際の処理」も参考になりました。 ありがとうございました

pringlez
質問者

補足

>Smartyを使えるなら使うべきだと思いますが あぁ、そうなんですかね。私のイメージでは、Smartyは「テンプレートに対し部分的に値を埋め込むもの」という感じです。 私がやりたいのは「部分的に値を埋め込む」という感じの部分もあるのですが、画面によって出力するテキストエリアやインプットボックスなどのForm系のオブジェクトも変わります。つまり変わる部分もやや多いという事です。こういうものには向かなそうというイメージがあります。 もちろん、変わる部分の複数行分をごっそりと変数にいれて埋め込めば実現可能ですが…。 こういう場合にも、Smartyを使うものなのでしょうか? その場合はどのように使いのでしょうか?やはり「変わる部分の複数行分をごっそりと変数にいれて埋め込む」のでしょうか?それとも他にいい方法があるのでしょうか? もしよろしければこの点についても教えてください。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#244856
noname#244856
回答No.2

実はSmartyでも似たようなことが出来ます。「if関数」 として実装されているものを使います。 Smarty3 マニュアル http://www.smarty.net/docs/ja/ PurePHPで困ることは無いのですが、Smartyの方が "テンプレート側は" シンプルに書けることが多く、また多機能です。 http://www.smarty.net/docs/ja/language.modifier.escape.tpl によれば、デフォルトでh関数を通したようにエスケープされた状態になると記載されています。プログラマの人為的ミスでXSS脆弱性を作ってしまう可能性をほぼ撲滅できますね。テンプレートの可読性も一般的にはSmartyの方がよくなると思います。 逆に "ロジック側は" assignメソッドで変数を1つ1つ割り当てる必要があるので、手間は増えます。また、パフォーマンス面ではややPurePHPより遅くなることは避けられないでしょう。どちらにもメリット・デメリットはありますが、実際の開発現場で多く使われているのはSmartyでしょうね。あくまで個人的にはPurePHPの方が好きですが…w なお、「h関数」という命名に関しては「htmlspecialchars」の頭文字をとったものとして広く利用されているようです。若干「escape」からとった「e関数」などの亜種があったりしますが、私は例外(Exception)を簡単にスローするためのラッパー関数としてこの名前で作成したことがあり、どちらかといえば前者の命名の方が適切ではないかと思いました。

pringlez
質問者

お礼

Smartyはデファクトスタンダードなのかもしれませんね。 上手い使い方を勉強したいと思います。 ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画面にそのままを出力したい

    初歩的な質問ですが、調べても出てこないので質問させてください PHPで記述したものをそのまま出力するにはどうしたらいいでしょうか Perlでいうところの print <<"任意の文字"; この中をそのまま出力 任意の文字 こんなことができる記述方法を探しています ようは、PHPでechoで書くと""でくくると内部にある"を全て\でエスケープしなくてはなりませんし、だからといって''にすると今度は'を\でエスケープしなくてはならないと思うのですが、いちいちくくったものと同じ記号のエスケープを考えなくていい方法を探しています。 ただし、内部で$など変数を使えるような方法が必要です。 何かいい方法を教えてください。

    • ベストアンサー
    • PHP
  • Nowdocの機能をphp5.2で使いたい

    php5.3からヒアドキュメント内部で変数が展開されないNowdocが使えるようになりましたが、 これと同様のことをphp5.2でできないでしょうか。 下のコードで、ヒアドキュメント内の内容を触らずに(\$hogeなどとエスケープせずに) 変数$hogeを展開させない方法を教えてください。 $source = <<<HERE <?php $hoge = "hogehoge"; ?> HERE; echo $source;

    • ベストアンサー
    • PHP
  • HTMLの出力で改行をさせない方法はありますか

    ASPでHTMLの一部だけASPの文法にしたい時、 <div><%= hogehoge %></div> のような感じで書くと思います。 ただ、ASPの部分が非常に長い場合にそこだけ改行したい場合が あります。 (上は変数を出力しているだけですが実際にはIf文などを使って いたりでもっと長いです) <div> <%= hogehoge %> </div> ↑だと出力されるHTMLも改行を含んでしまいます。 これをさせないようにするには <div><% = hogehoge %></div> こんな感じにするしかないのでしょうか。 これだとASPの見た目が悪いような気がするのですがどうにか ならないでしょうか。 <% %> ASPにおける↑の呼び方(正式名称)もよく分からないので (開始タグ/終了タグ?)調べようにも調べることができないでいます。 実は意外と当たり前のことだったりする可能性もありますが 何か方法があったら教えていただけると嬉しいです。

  • ダブルクウォートやヒアドキュメント内での変数や配列を使った計算の表記方法?

    素人の素朴な疑問なんですがよろしいでしょうか? echo等で出力する "" (ダブルクウォーテション)やヒアドキュメントの「中で」 変数や配列を使った計算をすることってできますか?たとえば $mynum = 5; echo "最初の計算結果は {$mynum}+100 です。"; //105 $myarray = array(8,13,25); echo "2番目の計算結果は {$myarray[2]}+100 です。"; //125 のようなイメージなんですが・・・。 素直に""の外に出して計算し、ピリオドで結合するとか、 echoより前で変数や配列の計算を済ませておくというのが筋かと思うのですが、 たとえばめったに条件を満たさないif文中のechoの中だけで、一回限りで使う時など、 ""の外に出したり、元の変数を変化させたり、新しい変数を設けたりしないで済んだらなぁ~、 と思いまして。できなければできないで何の問題もないんですが、 よろしければご教授ください。m(_ _)m

    • ベストアンサー
    • PHP
  • バッチファイルで改行の出力

    バッチファイルで,改行のみをファイルに追記したいのですがどのようにすればできますか? echo >> output.txt とすると「ECHO は <OFF> です。」と出力されてしまいます. 全角を出力すれば見た目は同じですが,純粋に改行のみの出力方法をお願いします.

  • 終端識別子 とは?

     以下PHP参考書の ヒアドキュメント の説明すが、その中に、「終端識別子」とあります。  「終端識別子」とは何のことなのでしょうか!?    もし、以下の説明の中に「終端識別子」があるのでしたら、何にあとるのですか!?   私は読解力にかけるので分かりません!?   宜しくお願いいたします。   P61 ヒアドキュメント    PHPでは複数行又がる長い文字列を手軽に利用する方法として、シングルクオートとダブル クオートのほかにヒアドキュメントという方法があります。ヒアドキュメントはヒアドキュメント 構文(<<<)のあとに終端識別子を定義し、その終端識別子が出現するまでを文字列とします。  終端識別子は必ず行頭から始まり、直前に空白(インデント)を含めず、すぐに改行する必要が あります。また、ヒアドキュメントの中では、ダブルクオートと同様に変数が展開されます。また、ダ ブルクオートはそのままダブルクオートになります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  <?php $age = 15; $foo = <<<EOI ヒアドキュメントでは、このように、 複数行にわたる文章をそのまま表記することができます。 Tom の年齢は "$age" 歳です。 EOI; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ もちろん、ダブルクオートで通常の文字列を定義するように、複数行にまたがる文字列を定義す ることもできます。しかし、文章の中にダブルクオートが含まれる長い文章などでは、いちいちダブル クオートにエスケープ(\")が必要となり、これで不便な場合があります。ヒアドキュメントは、た とえばHTMLのテンプレートを記述したり、コマンドラインのヘルプ文を作成するなどに役立ち ます。

    • ベストアンサー
    • PHP
  • バッチでテキストを出力したときに改行ができない

    バッチファイルでテキストを出力するのですが、改行ができません echo 一行目 > C:\temp.txt ? echo 二行目 >> C:\temp.txt として結果C:\temp.txtファイル内に  一行目  二行目 ではなく  一行目  二行目 としたいのですが、、 ?にはいるものがわかりません。 echo " " >> C:\temp.txt としても""が入ってしまうし echo   >> C:\temp.txt (全角スペース)を入れても"ECHO は <ON> です。"とメッセージが出てしまいます。 わかる方お願い致します。

  • HTMLで開いたsrcの改行コードを調べる方法を教えてください

    cgiでHTMLを作成していますが、cgiを実行した時に HTMLで改行が2個入ってしまいます。 unix上のファイルをfgetsにて1行ずつ読み込んで そのまま出力しています。 改行コードを削除したいのですが、 表示しているHTMLのsrc内にある改行コードに何(どの改行コード)が入っているのか分からず、削除できません。 (fgetsで読み込んだ1行の最後に"\0"が入っていると思って、それを削除してみたのですが、駄目でした。このやりかたは間違えていますか?正しい方法を教えてください。) 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • シート1から特定の条件でシート2に出力

    すみません、エクセルについてご教示ください。 シート1に入力したデータ中から条件にあったものを シート2に出力したいと思っています。 シート2の A3に該当月を指定(例)2012/09)することで、 シート1中から条件のあったデータをシート2中に出力することは可能でしょうか。 可能であれば関数などご教示いただけるとさいわいです。 ## エクセルに詳しくない社内の担当が、シート2のA3に該当月を入れるだけで ## 丸っとシート2をコピーして、必要なメールを作成できないかなあと考えています なお、条件にあるものが複数ある場合、該当するものをすべてシート2の 5行目以降に表示されるようにしたいと思います。 【シート1】                      行 __A__ __B___  __C__   ____D___  ____E____ 1  No. 該当月  管理番号 顧客名   備考 2  1  2012/09  11****  株式会社A  ちょめ 3  2  2012/09  23****  株式会社B  ちょめ 4  3  2012/10  27****  株式会社C  ちょい 5  4  2012/10  28*****  株式会社D  ちょい 【シート2】 行  __A__ ____B__ __C__ ____D____ __E__ 1  (ここにメールテンプレート) 2  (ここにメールテンプレート) 3  ★該当月★ の対応案件です。お願いします。 4 5  (以下 Sheet1 の B列で Sheet 2 A3 の該当月と一致するものの A~E列を出力。) 6 7

  • ヒアドキュメントと、htmlspecialcharsの違いを教えて下さい。

    PHPのセキュリティを強化しようと勉強しているのですが わからないことがあります。 セキュリティの本には、変数の出力の場合は、 htmlspecialcharsで書くべきと載っていますが、 これまでヒアドキュメントで書いていた部分も、 htmlspecialcharsに直す必要があるのでしょうか? ■ヒアドキュメント echo<<<EOD $hogehoge EOD; ■htmlspecialchars echo htmlspecialchars($hogehoge,ENT_QUOTES,'UTF-8'); この二つの違いと、 どちらがセキュリティとして良いかのかを教えて下さい。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • Lenovo Tab K10で使用できるペンの種類が知りたいです。
  • Lenovo Tab K10にはどのようなペンが使用できるのでしょうか?
  • Lenovo Tab K10に最適なペンの選び方を教えてください。
回答を見る