• ベストアンサー
  • 暇なときにでも

外部ファイル記述内容をヒアドキュメント上で実行

題名の通りなのですが、説明が難しいです.. 外部のテキストファイルを読み込み、もしPHPスクリプトが記述されていたら、それを実行させたいです。 例えば、下記のようなテキストファイルをディレクトリにアップし・・ (テキストファイルtext.txt内容) テスト,これはテストです。 <?php echo (date("Y年m月d日")); ?> テスト2,これはテストです2 下記のようなスクリプトがあったとして・・ (PHP実行ファイル内容) <?php $text = file_get_contents("text.txt"); $text = explode("\n", $text); $num0 = explode(',', $text[0]); $num1 = explode(',', $text[1]); $subject0 = $num0[0]; $subject1 = $num1[0]; $body0 = $num0[1]; $body1 = $num1[1]; echo <<<EOD <p>{$subject0}<br>{$body0}</p> <p>{$subject1}<br>{$body1}</p> EOD; ?> 実行すると、出力は・・ (実行結果) <p>テスト<br>これはテストです。 <?php echo (date("Y年m月d日")); ?></p> <p>テスト2<br>これはテストです2</p> ・・というようになるかと思います。 ようは、<?php echo (date("Y年m月d日")); ?>がそのまま文字列として出力されるだけです。 これを、下記のような出力結果が得られるようにしたいです・・ (欲しい実行結果) <p>テスト<br>これはテストです。 2016年11月10日</p> <p>テスト2<br>これはテストです2</p> 何か方法はありますでしょうか? ご教示頂けましたら幸いです。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数223
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1
  • t_ohta
  • ベストアンサー率38% (3445/9033)

セキュリティ上、外部ファイルの中のプログラムを実行するのはよくないので、  <?php echo (date("Y年m月d日")); ?> と書いておくのではなく  [[TODAY]] とか書いておいて置換処理するのが一般的かと思います。 一応 eval() と言うのがありますので実行可能ですが、PHPの開始タグ・終了タグは抜かなければいけないので、外部ファイルの記述を変える必要があります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 evalが参考になりました。 下記の記述で思っていたのが、実現しました。 <?php $text = <<<EOM テスト,これはテストです。 <?php echo (date("Y年m月d日")); ?> テスト2,これはテストです2 EOM; $text = explode("\n", $text); $num0 = explode(',', $text[0]); $num1 = explode(',', $text[1]); $subject0 = $num0[0]; $subject1 = $num1[0]; $body0 = $num0[1]; $body1 = $num1[1]; echo eval("?>".<<<EOM <p>{$subject0}<br>{$body0}</p> <p>{$subject1}<br>{$body1}</p> EOM ); ?> 実現できたのでベストアンサーとさせて頂きます。

関連するQ&A

  • ファイル書き込みが重複する

    こんばんわです。 以下のスクリプトで 投稿データを時系列に新しい書込み順に表示させようとしているのですが、一度実行させると同じ投稿がいくつも表示されてしまうのです。ご回答お願いいたします。一部省略しています。 <?php if($name== "" or $body == ""){ echo '<font color = "#FF000">必須項目入力エラー</font><br>'; echo 'お名前と本文は必ず入力してください<br>'; echo '<a href = "javascript:history.back()">戻る</a>'; } $body = substr($body, 0, 1000); $body = str_replace("\r\n", "<br>", $body); $dt = date("y/m/d H:i:s"); $data = file("data.txt"); $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\n"); $i = 1; foreach ($data as $value) { if($i < 30) { fwrite($file, "$value"); $i++; } } fclose($file); } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ $view = explode("\t",$value); if($mail== ""){ echo "お名前:$name$view[3]<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a>$view[3]<br>";} echo "本文:$body<br>"; } ?>

    • ベストアンサー
    • PHP
  • PHP入りのHTMLファイルの属性について

    PHPを使えるレンタルサーバーを試しているのですが、PHPを内包しているHTMLをアップして動作させようとすると、そのファイルに実行権がないとき「Internal Server Error」となってしまいます。 以前に使っていたレンタルサーバーでは実行権なんか必要なかった筈です。 全てのPHPに実行権をつければ済む話ではありますが、数が多いと面倒です。 実行権なしに動作させる方法はありませんか? php.ini や .htaccess の設定でなんとかなりませんでしょうか? 例えばこのファイル--------------------------- <html> <head> <META http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head> <body> <script language="php"> echo date('Y/m/d H:i:s'); echo "<BR>"; </script> </body> </html> ここまで---------------------------

    • ベストアンサー
    • PHP
  • ヒアドキュメントの中で別ファイルをインクルード

    PHPでヒアドキュメントの中で別ファイルをインクルードする方法はどのように処理するのでしょうか? sample.txt <p>サンプルテキストからの文字</p> ------------------------------------ sample.php $sample = <<<_EOM_ <html> <head> </head> <body> サンプルサンプル<br> *ここにsample.txt内のhtmlソースをインクルードしたい。 </body> </html> _EOM_; 以下省略(echoとかで出力)

    • 締切済み
    • PHP

その他の回答 (2)

  • 回答No.3

#1の御回答のように外部ファイルの信頼性がないと 怖いですし 読んだ後にキーを置換するほうが、見通しもよいとは思いますが、 PHPの出力をバッファリングして 変数に格納してしまうということは可能ではあります。 $text = file_get_contents("text.txt"); のかわりに ob_start(); include("text.txt"); $text = ob_get_contents(); ob_end_clean(); って感じです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 とりあえず別の方法でできました。 信頼性は不安ですが、外部ファイルとはいえ、自分のアップロードしたファイルのみ読み込みで、不特定多数のファイルを読み込ませるわけではないです。 ご教示いただいたコードは今後の参考にさせて頂きます。

  • 回答No.2

そんなコード、外部ファイル云々の前にこう書いたって動きませんよ。 <?php echo <<<EOD <p>テスト<br>これはテストです。 <?php echo (date("Y年m月d日")); ?></p> <p>テスト2<br>これはテストです2</p> EOD; ?> 本質的に何がしたいのかよくわかりませんが、「外部ファイルを読み込みそれを実行」でいいのならincludeするのが普通でしょう。 データを読んで取り込みたいのなら、データファイルに日付を出力すべきです。データファイルにPHPのコードを書くなんてありえないと思います。

共感・感謝の気持ちを伝えよう!

関連するQ&A

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

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

    • ベストアンサー
    • PHP
  • ファイルに記憶できない。

    こんにちわお聞きしたいのですが、以下のスクリプトで、送信で引渡されたデータを先に記録し、再度ファイルから取出し表示したいのですが data.txtに書き込まれないです。サーバーに上げている、data.txtの の属性は書き込みにしています。 <?php $submit = $_post["submit"]; if($submit == "送信"){ $name = $_POST["NAME"]; $mail = $_POST["MAIL"]; $body = $_POST["BODY"]; if($name== "" or $body == ""){ echo '<font color = "#FF000">必須項目入力エラー</font><br>'; echo 'お名前と本文は必ず入力してください<br>'; echo '<a href = "javascript:history.back()">戻る</a>'; exit; } $body = str_replace("\r\n", "<br>", $body); $fp = fopen("data.txt","w"); fwrite($fp,"$name\t$mail\t$body\n"); fclose($fp); } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ $view = explode("\t".$value); $name = $view[0]; $mail = $view[1]; $body = $view[2]; if($mail== ""){ echo "お名前:$name<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a><br>";} echo "本文:$body<br>"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • HTML中のPHPが実行されない

    以下のソースをindex.htmlにしてWebサーバーに置いたのですが、ウェブでアクセスはできますが、PHPの実行がされないようです。 それとも、PHPの使い方のミスでしょうか。 <HTML> <TITLE>TEST</TITLE> <BODY> あいうえお<BR> <?include("count.php");?>のアクセスです。<BR> <?php echo $_SERVER["HTTP_USER_AGENT"];?><BR> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • 外部ファイルから$a=1等の変数を読み込みたい

    <html> <body> <?php $contents = @file_get_contents('count.php'); echo $contents; ?> <span id="ck0001"><?php echo $count[ck0001] ; ?></span><br> <span id="ck0002"><?php echo $count[ck0002] ; ?></span><br> </body> </html> --------------------- count.txtの内容 $count[ck0001] = 4; $count[ck0002] = 3; こんな感じでここの値から引っ張ってきたいのですが、方法がわかりません。 備考:PHP触り始めてから今日で二日目です。

    • ベストアンサー
    • PHP
  • ASP記述式

    今、PHPの勉強をしているのですが・・最初の方でいきなりASPの記述式についてコードが書いていました。物凄く簡単なコードなのですが、下記のコードの中でASP記述式の「はじめまして(*^_^*) 」だけが表示されません。どうしたら表示されるのでしょうか?ご教授よろしくお願いします。 <!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>無題ドキュメント</title> </head> <body> <p> <b>基本形:</b><br> <?php echo"はじめまして(*^_^*)"; ?> <p> <b>短縮形:</b><br> <? echo"はじめまして(*^_^*)"; ?> <p> <b>スクリプト記述形:</b><br> <script language="PHP"> echo "はじめまして(*^_^*)"; </script> <p> <b>Active Server Page(ASP)式記述:</b><br> <% echo"はじめまして(*^_^*)"; %> </body> </html>

  • CGIで外部のPHPを実行するには?

    ルートにあるCGIから例えばphpフォルダにあるsample.phpを実行するには、 下記のような感じで良いのでしょうか? **********************************  #!/usr/bin/perl  print "Content-type: text/html\n\n";  print "sample.phpの実行\n<br>";  system 'php/sample.php';  exit; ********************************** 宜しくお願い致します。

    • 締切済み
    • CGI
  • 外部ファイルでクエリを実行したい

    「クエリを実行している間にローディング画像を表示する」という処理をしたいです。 外部ファイルの[load.php]内で「データベース接続→mysql_queryを実行する」という処理を 行い、[index.php]で結果を表示したいのですが、うまくいきません。 ※load.phpの中身をindex.php内に書いた場合は成功する ※load.phpの読み込み自体はできている。 [index.php] <script type="text/javascript"> $(function(){ $("#sample").load("load.php"); }) </script> <div id=sample> <div id="loader"><img src="edit/img/loader.gif" width="24" height="24" alt="Loading..." /></div> <?php echo $num; ?> </div> [load.php] <?php $conn = mysql_connect("localhost","DB","pass",true); mysql_query("SET NAMES utf8") or die("can not SET NAMES utf8"); mysql_select_db('DB',$conn); $sql = "SELECT &#65374;" $result = mysql_query($sql) or die(mysql_error()); $num = mysql_num_rows($result); ?>

    • ベストアンサー
    • PHP
  • PHPのエスケープシーケンスについての質問です。

    PHPのエスケープシーケンスについての質問です。 下記のコードで改行コードを<br>に置換し、結果を画面に出力しました。 $text = "あいうえお\\nかきくけこ\nさしすせそ"; $text = str_replace("\n", "<br>" , $text); echo $text; 実行結果は下記になりました。 あいうえお\\nかきくけこ さしすせそ 私の予想では、\\nが\<br>に置換され、下記になるかと思いました。 あいうえお\ かきくけこ さしすせそ なぜ\\nは\<br>に置換されず、そのままだったのでしょうか?

    • ベストアンサー
    • PHP
  • PHP+HTMLの確認画面から入力画面に戻る際のデータ保持について質問

    PHP+HTMLの確認画面から入力画面に戻る際のデータ保持について質問致します。 1.入力→2.確認→3.実行の3ページを作成しましたが、 2.確認で入力した値が間違っていた場合、1.入力に戻って訂正する仕様です 私は2.確認の戻るボタンにjavaのhistory.back();を使ったのですが ブラウザやOSにより、戻った際にデータが保持されていない場合があるとの事だったので 他の方法がないかご教授下さい。サンプルコードを書いて頂くと助かります。 以下、作成したコード 1.入力画面(mail.html) <html> <body> <form action="chk.php" method="post"> 件名:<br> <input type="text" name="subject" size="30" value=""><br> 送信者名:<br> <input type="text" name="name" size="30" value=""><br> メールアドレス:<br> <input type="text" name="mail" size="30" value=""><br> 本文:<br> <textarea name="message" cols="30" rows="5"></textarea><br> <br> <input type="submit" value="確認する">&nbsp&nbsp<input type="reset" value="クリア"> </form> </body> </html> 2.確認画面(chk.php) <?php $name = $_POST["name"]; $message = $_POST["message"]; $subject = $_POST["subject"]; $mail = $_POST["mail"]; ?> <html> <body> <form action="send.php" method="post"> 件名:<?php echo $subject; ?><br> 送信者名:<?php echo $name; ?><br> メールアドレス:<?php echo $mail; ?><br> 本文:<?php echo $message; ?><br> <input type="submit" value="これでOK"> &nbsp&nbsp //下記の戻るボタンで戻るとデータ保持をするようにしたい。history.back以外で。 <input type="button" value="戻る" onclick="history.back();"> <input type="hidden" name="name" value="<?php echo $name; ?>"> <input type="hidden" name="message" value="<?php echo $message; ?>"> <input type="hidden" name="subject" value="<?php echo $subject; ?>"> <input type="hidden" name="mail" value="<?php echo $mail; ?>"> </form> </body> </html> 3.送信画面(send.php) <?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); $message = "名前:" . $_POST["name"] . "\n本文:" . $_POST["message"]; if (!mb_send_mail("hoge@example.com", $_POST["subject"], $message, "From: " . $_POST["mail"])) { exit("メールの送信に失敗しました。"); } ?> <html> <body> <p>メールが送信されました。</p> </body> </html> 初心者ですので、わかりやすい表記をお願い致します。

    • 締切済み
    • PHP
  • 一つのphpファイルでframeset

    現在、一つのphpファイルからframesetで分割する方法を模索しておるのですが、どうやっても上手くいかずに困っている次第です。 内容は下記のコードになります。 どなたかご教授していただければ幸いです。 宜しくお願いいたします。 help.php-------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <?php $column = htmlspecialchars($_GET["column"]); if(!$column){ echo <<<EOD <frameset cols="150,*" frameborder="1" scrolling="auto"> <frame name="menu" src="help.php?column=menu" noresize /> <frame name="content" src="help.php?column=content" /> </frameset> <noframes> 申し訳ございません。<br /> あなたのブラウザではこのページをご覧頂けません。<br /> 最新版のブラウザをお使い下さい。 </noframes> EOD; }elseif($column == "menu"){ echo "aaa"; }elseif($column == "content"){ echo "bbb"; } ?> </body> </html>

    • ベストアンサー
    • PHP