PHPで送信された値は、すぐ変数に入れるものなの?

このQ&Aのポイント
  • PHPで送信された値を変数に入れる際の適切な方法について質問しています。おかしな値のチェックやリピート処理についても尋ねています。
  • PHPでテキストエリアに出力するプログラムの書き方について質問しています。長いプログラムの場合、わかりやすくするためにサブルーチンを作るべきかどうかも考えています。
  • PHPでテキストエリアの出力用のサブルーチンをどこに置くべきかについて質問しています。別ファイルにするか、HTMLのどの位置に書くかなどを尋ねています。
回答を見る
  • ベストアンサー

PHPで送信された値は、すぐ変数に入れるものなの?

PHPのプログラムについて、3つほど質問です。 問1 送信された値を使うとき、たとえば、$_POST["a"] というような書き方になると思いますが、 こうした送られた値というのは、$a=$_POST["a"];というようにして、すぐに変数に入れたほうが いいのでしょうか? おかしな値が入力されてきた場合のチェックとして、 if (!is_numeric($_POST["a"])){$_POST["a"]=1;} とか、 for ($i=1;$i<=$_POST["b"];$i++){ } というような使い方はしませんか? 問2 テキストエリアに、プログラムで算出した文字列を10件ほど出力させたいとき、 <textarea name="iroiro" rows="20" cols="50"> <?php ?> </textarea><br> として、<?php ~ ?> の間にプログラムを書き込めば、出力されますよね。 ただ、このプログラムが100行くらいになると、全体の流れが分からなくなって くると思います。 こんなときは、 <textarea name="iroiro" rows="20" cols="50"> <?php //データ表示用のサブルーチンへ飛ばす fun_data_hyouji() ?> </textarea><br> とかなんとか、書いて分かりやすくしようとしているのですが、業務にたずさわっている 方は、どんな書き方をするのでしょうか? そのままHTMLのなかの上記の位置へ書いて行く、サブルーチンを作って処理を飛ばす、などのご意見 を聞かせてください。 (というのも、参考にしているテキストが、HTMLとPHPが混ぜこぜになっていて、規模が 大きくなると、読みにくくなると思うからです) 問3 上記の問題で、サブルーチンを作るなら、どのあたりに作りますか? 別ファイルを作って呼び出す、</html>より下に書く、<body>の直後に書くなど、教えてくだ さい。ただし、このルーチンは、テキストエリアの出力しか使われないものとします。

  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
回答No.3

> <?php >   $hogeTags = createHogeTags(); >  ?> >  <?php >  function createHogeTags() { >   return "hogehoge"; >  } >  <html><body> >  <textarea name="iroiro" rows="20" cols="50"> >   <?php echo $hogeTags; ?> >  </textarea><br></body></html> > > という書き方にならない理由は何故でしょうか? > > 関数は、</html>よりも下に書くものなのでしょうか? まず初めに、</html>よりも下に書くという決まりはありません。 私の個人的な好き嫌いに過ぎません。 次に、上記のようにならない理由は、ロジックが重要なのではなく 出力内容が重要である為、ロジック部は末尾に置いています。 具体的なロジックは、出力が誤っている情報(変数)がその関数で あることが確定した後にデバッグされるべきものだと考えている からです。 はっきり言うと、見る必要もない部分を目にしてしまうのは邪魔です。 >「HTMLタグの直下に書いてPHPの終了タグは書きません」 > >の > >「PHPの終了タグは書きません」とは、?>を書かないということですか? ファイルの最後にのみ、?>は書きません。 ?>の後に改行などがあるとHTMLとして認識し、処理されてしまう為です。 余計な労力を使ってしまうかもしれないことが稀に起きます。

dv8hjkwf
質問者

お礼

ロジックを先に書いてしまうと、出力部分(HTML)を見るために、スクロールさせないといけませんね。ロジックが長くなれば、それだけ手間がかかるので、納得がいきました。 ご回答に感謝します。

その他の回答 (3)

回答No.4

1. とりうえずPHP5.3系(だったと思う)からは未定義に変数に対してエラー(Notice: Undefined index:)が出るようになっている まず$_POSTの中身がどうなっているのかのチェックが必須。 だからいきなり変数に突っ込むのはNG。 if(isset($_POST['a'])){ $a = $_POST['a']; }else{ $a = ""; } などの処理が必要。 is_numericの処理などはその後に変数$aに対して行います。 $_POSTはPHPのシステムが用意しているスーパーグローバルなので >$_POST["a"]=1 こんな使い方はしてはいけません。 ここら辺の事を今までの回答者が書いてないのが怖い。 2. 自分自身は普段からテンプレートエンジン(俺自身はSmartyをよく使用している)を利用して最低限システムとデザインは切り離しています。 そうすることによってデザイン変更作業が容易にしています。 結果として質問者のような無駄に関数を呼ぶとかの必要性はない状態。 3. あえてその方法で書くなら別ファイル化しておく。 それと俺自身は関数は使わない。クラスにする。

dv8hjkwf
質問者

お礼

回答ありがとうございました。 さすがに、$_POST["a"]=1という書き方は普通じゃないなと思いました。 テンプレートエンジンはよく耳にするので、これから学んでみますね。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

1. すぐでなくても良いですが、チェックして結果によって値を書き換えるなら、別の変数に入れた方が良いです。$_POST["a"] も書き換え可能ですが、あくまでポストされたパラメータという意味なのでそのままにする。 書き換えない場合はそのままでも良いですが、あとでやっぱり書き換えることにした場合に、上記の考えに立つなら、あちこちの$_POST["b"] を書き換えて回ることになるので、やはり、変数に代入した方が良いでしょうね。 2. それで良いと思います。 私なら、事前に変数に入れておいて、 <textarea name="iroiro" rows="20" cols="50"> <?php for($i=0; $i<$n; $i++) { echo $textdata[$i]."\n"; } ?> </textarea><br> とか。 3. 積極的な理由が無ければ別ファイルにはしないでしょうね。 場所は、自分でルールを作ればどこでもいいと思いますが、前の方が良いんじゃないかな。 >(というのも、参考にしているテキストが、HTMLとPHPが混ぜこぜになっていて、規模が 大きくなると、読みにくくなると思うからです) 規模が大きいと、フレームワークを使ったて処理部分と表示部分を分離すると思います。まあ、フレームワーク使うなら何故PHPを使うの?という気もしますが。

dv8hjkwf
質問者

お礼

回答ありがとうございます。 さすがに、$_POST系の変数にプログラム内で値を入れるのは、普通じゃないなと思いました。変数を用意することにします。 あらかじめ変数を作成しておけば、展開するだけなので、コードもすっきりしますね。

回答No.1

問1  プレーンなPHPコードならしますが、全てにおいてそうはしません。  デコードしたりする場合は、その結果を変数に格納して、  その変数に対してチェックしたりもします。 問2  1ファイル内でやるという制約なら、あくまでもロジックは  全て先に済ませ、次にHTMLを出力させる書き方をします。  <?php   $hogeTags = createHogeTags();  ?>  <html><body>  <textarea name="iroiro" rows="20" cols="50">   <?php echo $hogeTags; ?>  </textarea><br></body></html>  <?php  function createHogeTags() {   return "hogehoge";  }    もしくはCakePHPなどのフレームワークを利用する。  作業者や時間、上司がOSSを気に食わない諸々の条件下では、  要件を満たせるだけの最低限のMVCモデルの俺俺フレームワークを作ります。 問3  1ファイル内でやる制約なら、HTMLタグの直下に書いてPHPの終了タグは書きません。  簡易フレームワークを作るなら、特定ファイル名のアクションクラスなどを自動的に  インスタンス化させる作りを構築し、自動的に読み込ませるファイル上に記します。  大抵、MVCモデルを採用しているフレームワークのアクションコントローラー内に記します。

dv8hjkwf
質問者

お礼

毎回、お世話になっております。 問1については、了解しました。変数に入れたほうがよさそうですね。 問2について、 「ロジックは全て先に済ませ、次にHTMLを出力させる書き方」となっています。 では、 <?php   $hogeTags = createHogeTags();  ?>  <?php  function createHogeTags() {   return "hogehoge";  }  <html><body>  <textarea name="iroiro" rows="20" cols="50">   <?php echo $hogeTags; ?>  </textarea><br></body></html> という書き方にならない理由は何故でしょうか? 関数は、</html>よりも下に書くものなのでしょうか? 問3について 「HTMLタグの直下に書いてPHPの終了タグは書きません」 の 「PHPの終了タグは書きません」とは、?>を書かないということですか? <textarea name="iroiro" rows="20" cols="50">   <?php echo $hogeTags; ?> </textarea> というように、HTMLタグの直下に書くなら、終了タグは必要だと思うのですが…。 ご回答いただけるとありがたいです。

関連するQ&A

  • テキストエリア内にPHPのソースコードを書く

    <form action="" method="post"> <textarea name="img" cols=40 rows=4 readonly> <?php echo"<?php echo"masao"; ?>"; ?> </textarea></form> このプログラムの結果 <?php echo"masao"; ?> と表示したかったのですが案の定できませんでした。 どのようにしたら表示させることができるでしょうか?

    • ベストアンサー
    • PHP
  • 別のファイルへ値を受け渡す方法

    【index.php】というファイルで、画像のURLとテキストデータを【img.php】へ値を受け渡すプログラムを記述しています。 【index.php】では <form action="index.php" method="POST">  <textarea name="intxt" rows="10" cols="30"></textarea>  <input type="radio" name="image" value="4.jpg"> </form> <?php   $imgfile=$_POST['image'];   $text=$_POST['intxt'];   print "<img border='0' src='img.php?imgfile=$imgfile&text=$text'>"; ?> と記述し、 【img.php】ファイルで値を受け取るために、   $text=$_GET['text'];   $imgfile=$_GET['imgfile']; と記述しました。 しかし、値が受け渡されていません。  $text=$_POST['text'];  $imgfile=$_POST['imgfile']; でも試してみましたが、結果は同じく値が受け渡されていませんでした。 何か足りないのでしょうか? 開発環境は、PHP5.2.5、Apache2.2、WindowsXPです。 知恵をお貸しください。 お願いします。

    • ベストアンサー
    • PHP
  • htmlからphpに値送り

    投稿ボタンを押してデータは送られますが もう一回送ると上書きされてしまい一回目の値がなくなります 保存できる方法を教えてください test.html <form name="iform" action="test.php" method="post"> 企画名:<input type="text" name="kikaku"><br> 開催予定日:<input type="text" name="tuki_1" onblur="NumberCheck();">月 <input type="text" name="hi_1" onblur="NumberCheck();">日~ <input type="text" name="tuki_2" onblur="NumberCheck();">月 <input type="text" name="hi_2" onblur="NumberCheck();">日<br> 企画内容<br> <textarea name="naiyou" rows="4" cols="40"></textarea><br> <input type="submit"alue="投稿" onClick="return Check();"> <input type="reset" value="入力内容をリセットする"> </form> test.php <?php $kikaku = $_POST['kikaku']; $tuki_1 = $_POST['tuki_1']; $hi_1 = $_POST['hi_1']; $tuki_2 = $_POST['tuki_2']; $hi_2 = $_POST['hi_2']; $naiyou = $_POST['naiyou']; print("企画名:$kikaku<br/><br/>"); print nl2br("$naiyou<br/><br/>"); print("$tuki_1 月 $hi_1 日~ $tuki_2 月 $hi_2 日"); ?> もうひとつ悩みがあり 投稿すると新しい記事ができる仕組みについても 教えてほしいです ・新しい記事 ・新しい記事 こういった感じにできないでしょうか

  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • メール送信時の不具合

    以下a.html→b.html→c.phpのフローでテキストエリアに入力された文章がc.php内で一行しか表示されませんでした。 全文表示したいのですが、どうすれば良いのでしょうか?ちなみにhtmlファイル内でもphpは使える環境になっています。サーバはロリポップです。 どなたか助けて下さい。よろしくお願い致します。 ■a.htmlファイル <form method=post action="b.html"> 内容:<br> <textarea name="comment" rows="5" cols="70"></textarea> <br> <input type="submit" value="確認"> <input type="reset" value="リセット"> </form> ■b.htmlファイル 内容:<?php echo $comment;?><br> で送信致します。<br> 宜しいですか?<br><br> <form method="POST" action="c.php"> <input type="hidden" name="comment" value=<?php print($comment);?>> <input type="submit" value="送信" /> </form> ■c.php <?php $comment=$_POST['comment']; echo $comment; ?>

    • ベストアンサー
    • PHP
  • ...データを一行ごと別々の変数

    <TEXTAREA rows="8" cols="20"></TEXTAREA> の内容をPOSTで送り、受け取ったデータを一行ごと別々の変数に入れたいのですが、 どうすればいいのでしょうか?

    • 締切済み
    • PHP
  • 複数のsubmitボタンを使い値を送信する

    <form action="/サーブレットへ" method="post"> <input type ="TEXT" NAME="text1"> <input type ="TEXT" NAME="text2"><br> <textarea name="zzzz" cols="100" rows="10"> </textarea> <input type="hidden" name="a1" value="3"> <input type="submit" name="a1" value="作成"> <input type="hidden" name="a1" value="2"> <input type="submit" name="a1" value="修正"> </form> 複数のsubmitを使用してそれぞれ違う、値又は変数を渡し処理をしたいのですが、わかりません。 分かる方がいましたら教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • phpの掲示板で新しい順に表示したい

    php初心者です。 phpで掲示板を作っています。 新しい順に表示したいのですが、やり方がわかりません。 古い順に表示するやり方はわかるのですが、どうやったらよいでしょうか。 古い順のソースです <html> <head> <title>一行掲示板</title> </head> <body> <h2>一行掲示板</h2> 書き込む内容を入力してください。<hr color="black"> <form name="form" action="./sample01.php" method="POST"> タイトル      <input type=text name="title" action="./sample01.php" size="30" method="POST"><br><br> 名前          <input type=text name="namae" action="./sample01.php" size="30" method="POST"><br><br> メッセージ  <textarea name="body" rows="5" cols="50"></textarea> <input name="write" type="submit" value="書込"> <input name="write" type="reset" value="リセット"><hr> </form> <?php $data = file("../php/test1.txt"); for($i=0; $i<sizeof($data); $i++){ print "タイトル.${i}:<br>\n名前.${i}:<br>\n記事NO.${i}:${data[$i]}<br>\n<hr>"; } ?> <br> <a href="../phpcollect/index.html">トップページへ</a> </body> </html> どうかわかる方おりましたらご教授お願いします。

    • 締切済み
    • PHP
  • phpでハイパーリンクして値を持っていきたい

    今phpを使ってhtmlのタグを使いハイパーリンクして値を持っていきたいのですけどよくわかりません for($i;$i>=0;$i--){ echo '<a href="user.php">'.$arr[$i].'</a><br />'; echo $i; このようにプログラムは書いてます user.phpに arr[$i]の値をそれぞれ持っていきたいのですけど どのように書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • フォームに入力した値の制御について

    フォームに入力した値の制御について いろいろと調べてみたのですが、 どうすれば良いか分からないので、 質問をさせて頂きました。 【概要】 フォームの[text]と[textarea]に入力をしてもらいたい 入力値のサンプルを表示されるようにしました。 カーソルを[text]と[textarea]に入れると、 入力値のサンプルの表示が消えて入力出来るようにしました。 【やりたい事】 [text]と[textarea]に入力をしてもらった値を、 最終的にtextareaに出力させるようになっています。 何も入力せず出力をさせると、サンプル値は出力されてしまいます。 [text]と[textarea]に入力をした値のみ出力させることは可能でしょうか。 ご教授頂ければと思います。 よろしくお願いいたします。 【ソース】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN Frameset" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <script type="text/javascript"> <!--ログ生成スクリプトを取得--> function textoutput(formObj) { <!--text01を取得--> var text01 = formObj.elements["text01"].value; <!--text02を取得--> var text02 = formObj.elements["text02"].value; <!--textarea01を取得--> var textarea01 = formObj.elements["textarea01"].value; <!--textarea02を取得--> var textarea02 = formObj.elements["textarea02"].value; <!--出力データを作成--> var text = ''; <!--text3データを作成--> if(text01!==""){ text += '質問1:' + '\n'+ text01 + '\n'; } <!--text2データを作成--> if(text02!==""){ text += '質問2:' + '\n'+ text02 + '\n'; } <!--textarea01データを作成--> if(textarea01!==""){ text += '質問3:' + '\n'+ textarea01 + '\n'; } <!--textarea02データを作成--> if(textarea02!==""){ text += '質問4:' + '\n'+ textarea02 + '\n'; } <!--出力データを作成--> formObj.elements["output"].value=text; } </script> </head> <body> <form name="form01"> <strong>・諮問1:</strong><br> <input type="text" name="text01" value="1入力してください" id="p1" size="30" class="disabled" onfocus="if (this.value == defaultValue) this.value = '';" onblur="if (!this.value) this.value = defaultValue;"><br> <strong>・諮問2:</strong><br> <input type="text" name="text02" value="2入力してください" id="p2" size="30" class="disabled" onfocus="if (this.value == defaultValue) this.value = '';" onblur="if (!this.value) this.value = defaultValue;"><br> <strong>・諮問3:</strong><br> <textarea name="textarea01" id="textarea01" cols="60" rows="5" onfocus="if(this.value == this.defaultValue) this.value=''" onblur="if(this.value == '') this.value=this.defaultValue"> 3入力してください </textarea><br> <strong>・諮問4:</strong><br> <textarea name="textarea02" id="textarea02" cols="60" rows="5" onfocus="if(this.value == this.defaultValue) this.value=''" onblur="if(this.value == '') this.value=this.defaultValue"> 4入力してください </textarea><br> <strong>・出力結果:</strong><br> <input type="button" value="ログ出力" onClick="textoutput(this.form);">&nbsp;<br> <textarea cols=60 rows=20 name="output" ></textarea> </form> </body> </html>