PHP「中括弧内にPHP終了タグ」

このQ&Aのポイント
  • PHP参考書のサンプルプログラムに関しての質問です。参考書は2013年のもので、プログラムの対応バージョンはPHP5.3、5.4、5.5と記載されています。問題のプログラムはログインフォームのサンプルプログラムで、if ($_SESSION['auth'] !== true) { の中で一度PHP終了タグが入ることに違和感を感じています。
  • 質問する人は、HTMLの知識はあるが、PHPを勉強し始めたばかりのようです。
  • PHPを勉強中の方がログインフォームのサンプルプログラムに関して質問しています。プログラムの中括弧内で一度PHP終了タグが入ることに違和感を感じ、情報がないか探しているようです。
回答を見る
  • ベストアンサー

PHP「中括弧内にPHP終了タグ」

PHP参考書のサンプルプログラムに関しての質問です。 参考書は2013年のもので、プログラムの対応バージョンはPHP5.3、5.4、5.5と記載されています。 問題のプログラムはログインフォームのサンプルプログラムです。 <?php ~~略~~ if ($_SESSION['auth'] !== true) { ?> <!DOCTYPE html> <html lang="ja"> <head> ~~略~~ </head> <body> ~~略~~ </body> </html> <?php exit(); } という内容で、 if ($_SESSION['auth'] !== true) { ?> と{}内で一度PHP終了タグが入ることにとても違和感を感じ、色々調べているのですが、 この記述方法に関する情報が見つかりません。 サンプルプログラムは問題なく動作します。 HTMLの知識はあるのですが、現在PHPを勉強し始めたばかりです。 どなたか分かる方いますでしょうか よろしくお願いします。

  • k_mo
  • お礼率100% (9/9)
  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6630/9393)
回答No.3

>一度PHP終了タグが入ることにとても違和感を感じ、色々調べているのですが、 >この記述方法に関する情報が見つかりません。 ちょっとした考えの違いです。 【「?>」は、PHPの終了タグではありません。】 ---- どういうことかって? PHPプログラムは、HTMLテキスト内に書きます。 ここでHTMLの原則に立ち戻ってみると、HTMLでのタグというのは、「<」で始まり「>」で終わる、と定義されています。 タグにパラメータがある場合、例えば <タグ名 パラメータ1=値1 パラメータ2=値2 オプションA オプションB> という感じに書きます。 そしてHTMLに定義されていない名前のついたタグは、そのタグ「<名前 ~>」が丸々無視される、というルールになっています。 つまり、HTMLの解釈上は、PHPプログラムを含んだファイルというのは、 <?php 何やら良くわからないオプションいっぱい > という知らない名前「?php」のタグが、1つあるいは複数含まれている、というだけのものに過ぎません。 一方、PHP利用可能なサーバからそのファイルを見る場合、 <?php ~ ?> によって囲まれた部分を、プログラムソースとして取り出し、実行する。 それは複数箇所に分かれていても構わない。 という事になっています。 そうすると、 <?php プログラム1行目 ?> <?php プログラム2行目 ?> <?php プログラム3行目 ?> と書いたものと、 <?php プログラム1行目 プログラム2行目 プログラム3行目 ?> は、全く同一のプログラムであるのです。 ですから、 <?php プログラム1行目 プログラム2行目 ?> (中略) <?php プログラム3行目 ?> となっていても、phpプログラム部分を抽出した場合には全く同一のプログラムとなり、ちゃんと動いてしまいます。 -- 「<?php」~「?>」というのは、HTML中にphpプログラムを置くために考案された記述方法であり、phpプログラムの処理単位やプログラムの区切りを示すものではありません。 という言うことで、なぜ]「 exit(); }」をそんな場所にまで離して書いたのか、という理由はよく分かりませんが、そういう記述も許可されるわけです。

k_mo
質問者

お礼

>「?>」は、PHPの終了タグではありません。 >phpプログラムの処理単位やプログラムの区切りを示すものではありません。 私の誤解を全て指摘していただけたような、、、 ご指摘の通り、 HTMLの開始タグ、終了タグの概念のままの私は、{}が?>や<?phpをまたぐと言うのが全くもって理解できませんでしたが、 その誤解を払拭していただき、その後読ませていただいた全てのご回答をすんなり理解することができました。 ありがとうございます。 ちなみに認証が必要なページのトップで require_onceでこのログインフォームページを読み込むのですが、ログインしていない場合は認証が必要なページを出力しないため、exit();が最後に入っているようです。

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.2

ごく普通に使う記述方法です。 PHPは <?php から ?> の間をPHPで書かれたプログラムとして認識し、それ以外はHTML等で書かれたモノとして何ら処理せずそのまま出力します。 なので、?> から 次の <?php までの間は echo 文などで書き出すのと同じ結果になります。 <?php if ($_SESSION['auth'] !== true) { ?> <!DOCTYPE html> <?php } ?> と書くのか <?php if ($_SESSION['auth'] !== true) { echo "<!DOCTYPE html>"; } ?> と書くのかの違いです。

k_mo
質問者

お礼

ごく普通に使う記述方法 だったのですね。急に特殊な記法が出てきたと思い混乱していたのですが、「ごく普通の記法」と言われた途端、なぜか安堵いたしました。 私の中では{}が終了タグをまたぐと言うのが全く意味が分からなかったのですが、 <?php if ($_SESSION['auth'] !== true) { echo "<!DOCTYPE html>"; } ?> このサンプルプログラムと 「?> から 次の <?php までの間は echo 文などで書き出すのと同じ」 「そういうことだったのか...」と理解できました。 ありがとうございました。

回答No.1

あ~それ、一般的な書き方ですよ。 <?php if (false) { ?> ここが、HTMLとしてのコメントになる。 <?php } ?> って書き方ですね。 要するに、今書いている物を「だれが処理するか?」の 空間を書いてるにすぎませんよ。 <?php ここはPHPが処理 ?> こっちは普通に送り出される部分。 また、逆もありますよ。 HTML などで、<<?= $abc ?>> これは、$abcの内容を<>で囲んだものが出力されます。

k_mo
質問者

お礼

一般的な書き方だったのですね。 <?php if (false) { ?> ここが、HTMLとしてのコメントになる。 <?php } ?> の構文のようにシンプルな表記を見て、なるほど納得いたしました。 とてもすっきりしました。 htmlでの<<?= $abc ?>>と言った表記 これもまた面白いテクニックですね... 1つ2つの参考書だけでは分からない記法がたくさんあるんだと思いました。 ありがとうございます。

関連するQ&A

  • PHPのログイン処理について

    PHPのログイン処理について教えてください。 「login_auth.phpファイル」 <?php //session開始 session_start(); session_regenerate_id(true); //エラーメッセージを格納する変数を初期化 $error_message=""; //ログインボタンが押されたかを確認 if(isset($_post["sub"])){ if($_post["auth_id"] == "auth" && $_post["auth_pass"] == "1234"){ //ログインが成功した証拠をセッションに保持する $_session["login_name"] = $_post["auth_id"]; //管理者トップへWebブラウザをリダイレクトさせる $login_url = "http://{$_server["http_host"]}/reservation/auth_top.php"; header("Location: {$login_url}"); exit; } $error_message = "IDかPASSが間違えています"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'.$error_message.'</font>'; } ?> <center> <hr size="2" color="blue" width="50%"><br><br> <font size="4"><b>管理者認証画面</b></font> <br><br><hr size="2" color="blue" width="50%"><br><br> ユーザID/パスワードを入力してください。 <form action="login_auth.php" method="post"> <table border="2"> <tr> <td bgcolor="cyan">ユーザID</td> <td><input type="text" name="auth_id" value=""></td> </tr> <tr> <td bgcolor="cyan">パスワード</td> <td><input type="password" name="auth_pass" value=""></td> </tr> </table> <input type="submit" name="sub" value="ログイン"> </form> <a href="javascript:window.close();" target=_parent>閉じる</a> </center> </body> </html> 「auth_top.phpファイル」 <?php //セッションを開始する session_start(); //ログインが成功した証拠である変数のチェックを行なう if (!isset($_SESSION["login_name"])) { //変数に値がセットされていない場合は不正な処理とみなし、ブラウザをログイン画面へリダイレクトさせます $no_login_url ="http://{$_server["http_host"]}/reservation/login_auth.php"; header("Location: {$no_login_url}"); exit; } ?> 管理者画面です。 この簡単なプログラムなんですが、IDとPASSを入力しても画面が切り替わりません。 今、そこで行き詰っています。 どなたか教えていただけないでしょうか??

    • 締切済み
    • PHP
  • zampp  PHPでPOSTの変数が返ってこない

    お世話になります。 PHPを最近はじめたばかりの初心者です。 zampp をインストールし、Apache、PHPの動作は問題なく動いています。 「sample.html」「sample.php」の2つファイルを作成し、 C:\xampp\htdocsに保存しました。 「sample.html」と「sample.php」は、ある本からサンプルコードです。 ------------------- 「sample.html」 ------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>sample page</title> </head> <body> <h1>フォームサンプル</h1> <form method="post" action="sample.php"> <input type="text" name="text1"> <input type="submit"> </form> </body> </html> ------------------- 「sample.php」 ------------------- <?php $str = $_POST['text1']; if ($str != ""){ $msg = "あなたは、「{$str}」って書いたね?"; } else { $msg = "何も書いてなかったよ?"; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>sample page</title> </head> <body> <h1>結果表示</h1> <div><?php echo $msg; ?> </body> </html> ------------------------------------ htmlファイルをブラウザーで開き、submit(送信ボタン)を押すと、 text1に入力した文字が、返ってきて .phpに表示されなければならないのですが、 .phpでブラウザーに表示されるのは、上記のコードがそのまま表示されてしまいます。 (入力した文字も代入されずに、コードのまま表示されます) 上記のコードとは違う、htmlファイルとphpファイルで動作させても コードがそのまま表示されて、$_POSTがうまいきません。 原因が分からずに困っています。 ご教授いただけますよう何卒よろしくお願いします。

    • ベストアンサー
    • PHP
  • php初心者です。セッションについて

    php初心者です。セッションをはじめて扱ってみているのですが、上手く行かずに困っています。 HP1でセッションに文字や数値を入れて表示、HP2でも表示というごく単純なものでセッションを試して見ているのですが上手く行かずにいます。 何か初歩的な間違いだとも思うのですが、どうにも上手くゆかず質問させていただきました。何に問題があるかアドバイスやご助言をいただければと思います。 よろしくお願いします。 ---------------------- HP1 ---------------------- <?php session_start(); //セッション開始 $_SESSION["str"] = "aiueo あいうえお"; $_SESSION["num"] = 1; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <title>session01</title> </head> <body> <p>page1</p> <?php print $_SESSION["str"]."<br />"; print $_SESSION["num"]."<br />"; ?> <p><a href="session02.php">page2へ</a></p> <?php ?> </body> </html> ---------------------- HP2 ---------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <title>session01</title> </head> <body> <p>page1</p> <?php print $_SESSION["str"]."<br />"; print $_SESSION["num"]."<br />"; ?> <p><a href="session01.php">page1へ</a></p> <?php ?> </body> </html>

    • 締切済み
    • PHP
  • 次のPHP BASIC認証画面で

    My Realmですよ が文字化けするのですがどうすればいいのでしょうか? このphpをFC4ーPCに配置してWindowsMeーPCのブラウザでこのphpを表示させています <?php echo' <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <meta http-equiv="content-style-type" content="text/css"/> <title>goo</title> </head> <body> '; if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate:Basic realm="My Realmですよ"'); header('HTTP/1.0 401 Unauthorized'); echo "ユーザーがキャンセルボタンを押した時に送信されるテキスト\n"; exit; } else { echo "<p>こんにちは、{$_SERVER['PHP_AUTH_USER']} さん。</p>"; echo "<p>あなたは、{$_SERVER['PHP_AUTH_PW']} をパスワードとして入力しました。</p>"; } echo' </body> </html> '; ?>

    • 締切済み
    • PHP
  • PHP文法エラーについて

    はじめて、お世話になります。よろしくお願い致します。 プログラム文は後述致しますが、実行すると、ブラウザに下記エラーが表示されます。何のエラーで、どこを直せば、よいのでしょうか? Parse error: syntax error, unexpected ';', expecting ',' or ')' in C:\xampp\htdocs\Step2Kadai\kakunin.php on line 16 kakunin.php on line 16のところは、 echo htmlspecialchars($_SESSION['mail']; です。 [input.php] <?php session_start(); $_SESSION['address'] = $_REQUEST['address']; ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MF-02 input</title> <meta charset="utf-8"> </head> <body> <h1>MF-02 input</h1> <form action="mf_form.php" method="post"> <p>アドレス: <input type="email" name="address"> <input type="submit" value="送信"></p> </form> </form> </body> </html> [mf_form.php] <?php session_start(); $_SESSION['mail'] = $_REQUEST['mail']; ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MF-02 form</title> <meta charset="utf-8"> </head> <body> <h1>MF-02 form</h1> <p><a href="kakunin.php">確認<?php echo htmlspecialchars($_SESSION['mail']); ?></a></p> </body> </html> [kakunin.php] <?php session_start(); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MF-02 kakunin</title> <meta charset="utf-8"> </head> <body> <h1>MF-02 kakunin</h1> <p>アドレス: <?php echo htmlspecialchars($_SESSION['mail']; ?>) <?php </p> </body> </html> 以上です。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP

    PHPで、 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>テストのページ</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <p>これはテストです</p><p>本日は 晴天なり</p> </body> </html> と、簡単なプログラムを打ったんですが、ブラウザで表示されません。ちゃんとApacheも設定したのですが・・・ どうすれば、ブラウザで表示できるようになるのでしょうか?

    • 締切済み
    • PHP
  • PHP SESSION 設定について

    PHP(レンタルサーバー:5.3.6)(ローカル:5.3.26)を使用しています。 簡単なログインフォームを作っていました。 ローカルでテスト運用したところ、問題なく動作していたのでレンタルサーバーにアップロードしたところ、SESSIONが動いていない(?継承していない?)ことに気づきました。 そこでphpinfoを確認すると レンタルサーバーは、 session.cookie_httponly=1(On) session.cookie_secure=1(On) になっていました。XSS攻撃に全部ではないけどレンタルサーバーの設定だと有効だということなので、ローカルもレンタルサーバーの設定に合わせたいと思っています。 ※設定をoffにすると問題なく動作します。 sample2.phpで、「$_SESSION['sample_title']」が表示されなくなってしまいました。 どのようにすれば、sessionが正しく動作するかご教授お願いいたします。 抜粋スクリプト ■sample1.php session_start(); session_regenerate_id(TRUE); $_SESSION["sample_title"] = "PHPのSESSION"; //セッション登録 echo "$_SESSION['sample_title']に代入した値は「<?php echo $_SESSION['sample_title'] ?>」です。"; echo "<a href = 'sample2.php'>次のページ</a>"; ■sample2.php session_start(); session_regenerate_id(TRUE); echo "受け取ったセッション変数の値は「".$_SESSION['sample_title'] ."」です。";

    • ベストアンサー
    • PHP
  • php初心者です。クイズについて

     phpでランダムに問題が表示され、それに答えると「正解!」、 「不正解!」となるようにしたいのですが。(単語カードみたいな)  問題をランダムに表示することは出来たのですが、問題に 対しての答えをどの様に記述すればいいのでしょうか? (下記のソースに追加・修正をして頂くか、参考となるサイト があれば教えて頂けないでしょうか?)  当方、phpをかじり始めたばかりなので、わかりやすく 教えて頂けると助かります。  どなたか、ご教授宜しくお願い致します。 <?php $quiz = array("りんごを英語で?", "いちごを英語で?", "とまとを英語で?"); shuffle($quiz); error_reporting(E_ALL & ~E_NOTICE); $kotae=$_POST["kotae"]; if ($_SERVER['REQUEST_METHOD']=="POST") { $message = ($quiz['answer'] == $_POST['kotae']) ? "正解!" : "不正解!"; echo $message; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> </head> <body> <form action="" method="post"> <p>Q. <?echo current($quiz); ?> </p> <input type="text" name="kotae" size="50"><br><br> <input type="submit" value="回答する!"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • ☆PHP <SELECT>タグについて

    セレクトタグのデフォルト値についてですが、一般の実装の仕方では、以下のようにするかと思いますが、 ・ソース例 -------------------------------------------- select.php -------------------------------------------- <!--同じページでのセッション間でのやりとり で、「送信」を押されると、POSTデータを自分に返し前操作情報をそのまま持続させる。簡単に言えば、ページが切り替わっても各nameプロパティの値を持続させたいのです。--> <html>d <head> </head> <?php session_start(); if(isset($count))$count =0;//カウンタが殻なら 0を代入 session_register("count","onamae");//セッション変数を登録 $count++;//アクセスカウンタ ?> <body> <form> <form method="POST" action="select.php" > <input type="text" name="namae" value="<?php echo $_POST['onama']; ?>"<!--問題なしです--> <select name="food" > <option value="れもん" selected>れもん</option><!-- 注目!! --> <option value="すいか">すいか</option> <option value="オレンジ">オレンジ</option> </select> <input type="submit" value="送信" > </form> </body> </html> -------------------------------------------------------------------------- こんな感じですが、<select>のデフォルト値をページが切り替わっても選択された値(ユーザ操作)が持続されません。 誰か親切な方早急にご教授くださいませ。

    • ベストアンサー
    • PHP
  • PHPの中にHTMLを入れるには

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <body> <?php $test = てすと; print '<p>$testしています。</p>'; ?> </body> </head> 「てすとしています。」と書き出したいのですが、このソースだと 「$testしています。」と表示されてしまいます。 うまく表示するにはどうすればいいのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう