セッションを利用した入力フォーム 誤りの指摘やご意見はこちらへ ご意見板
BBS

PHP Top
項目
セッションを利用した入力フォーム ↑項目に戻る

セッション(session)を利用したフォームを作成しましょう.

セッションを使うと,ページを移動しても,指定したデータを引き続き保持することができます.

今回は例題として,ユーザに「ウェブページのタイトル」,「URL」, 「メールアドレス」を入力してもらい,入力内容を確認後,データベースに保存するプログラムを 作成してみましょう.
※会員登録などのフォームをイメージして頂けるとわかりやすいと思います.

用意するファイル(ファイルですが,左クリックを使うのではなく,右クリックから保存してください.)
input.php  ユーザにタイトル,URL,メールアドレスを入力してもらうためのフォームです.
confirm.php ユーザが入力した内容に不備がないか,表示します.
regist.php 最終的にユーザの入力した内容が登録されたことを示します.
definition.php ちょっとした工夫を施すために利用するファイルです.またあとで説明します.

以下にプログラムの流れを掲載します.



■プログラムの流れ
・入力フォームがあるinput.phpから.ユーザは「ウェブページのタイトル」,「URL」, 「メールアドレス」を入力します.
・confirm.phpは,ユーザの入力結果をPOSTメソッドで受け取り,入力結果をユーザに確認します.
問題が無ければ,ユーザは確認ボタンを押します.
(この際に入力した内容に不備があればエラーを返し,input.phpに戻ります.)
confirm.phpはセッションに入力結果を保存します.
・regist.phpでは,セッションデータに保存された入力内容を復元します.
復元された入力内容をDBに登録し,最終的に登録完了通知がユーザに示されます.

■解説
まずは以下のテーブルを用意してください.DB名,テーブル名は任意でかまいません.

フィールド名 フィールド型 属性
title varchar  
url varchar  
address varchar  

まずは,以下を定義したdefinition.phpを用意します.
これは「PHPの定数」と,「HTMLのname属性」を対応付け,複数のphpファイルで分かりやすく扱うために使用します.
PHPを作成するプログラマと,HTMLを作成するデザイナなどで,分担作業を行う際も,この方法を上手に使えば, HTMLのフォームに修正が入った際,複数のPHPのプログラムに容易に反映することが出来ます.

<?php

  //TITLE, URL, MAILを定数として扱う

  define( 'TITLE', "my_title");
  define( 'URL', 'my_url' );
  define( 'MAIL', 'my_mail_address');

?>


次にユーザが入力するためのフォームであるinput.phpを作成してください

<html>
<body>
<b>sessionを利用した登録</b>
 <br><br>
 <form method = "post" action = "confirm.php">
 <?php

//input.php

session_start();

  
require_once "definition.php";

  
  $title_txt = "";
  $url_txt = "";
  $mail_txt = "";
  
  if(isset($_SESSION[TITLE])) $title_txt = $_SESSION[TITLE];・・・
  if(isset($_SESSION[URL])) $url_txt = $_SESSION[URL];
  if(isset($_SESSION[MAIL])) $mail_txt = $_SESSION[MAIL];


  echo "タイトル<br><input type = \"text\" name = \"my_title\" value=\"$title_txt\"><br>";
  echo "URL<br><input type = \"text\" name = \"my_url\" value=\"$url_txt\"><br>";
  echo "メールアドレス<br><input type = \"text\" name = \"my_mail_address\" value=\"$mail_txt\"><br><br><br>";
  echo "<input type =\"submit\" value=\"登録\"><br>";
  ?>
 </form>
</body>
</html>


input.phpではdefinition.phpを1度だけ読み込む関数であるrequire_onceを呼び出しています.これにより,definition.phpで定義されたTITLE,URL,MAILの値を利用することが出来ます.

次はinput.phpで入力されたデータをユーザに確認してもらうために,confirm.phpを呼び出します.
$_POST変数から入力された情報をこのプログラムでは空で無いか確認しています.(下 confirm.php のソースコードの )もし空であればエラーを出力し,input.phpに戻ります.


<html>
<body>

<?php
  
  //confirm.php

  session_start();//defineとの関係

  require_once "definition.php";

  //これにFALSEが入力されたら,アウト
  $bConfirm = array(TITLE=>TRUE, URL=>TRUE, MAIL=>TRUE);
  $nextPage = TRUE;//FALSE
  
  // 下の方に自分で定義した関数 文字がはいっているか return "true" or "false"
  $bConfirm[TITLE] = containsChar( $_POST[TITLE] );
  $bConfirm[URL] = containsChar( $_POST[URL] );
  $bConfirm[MAIL] = containsChar( $_POST[MAIL] );
  
  //フォームすべてに文字がはいっているか確認
  foreach($bConfirm as $value){
    if(!$value){
      $nextPage = FALSE;
    }
  }
  //入っていたら
  if($nextPage){
    echo "以下の内容でよろしいでしょうか?<br><br>";
    echo "タイトル : ".htmlspecialchars($_POST[TITLE], ENT_QUOTES)."<br>";
    echo "URL : ".htmlspecialchars($_POST[URL], ENT_QUOTES)."<br>";
    echo "アドレス : ".htmlspecialchars($_POST[MAIL], ENT_QUOTES)."<br>";

    echo "<br><b><a href=\"regist.php\">確認した上で登録<a></b>";
  }
  
  //入っていなかったら
  else{
    echo "<br><font color=\"red\">入力の足りない箇所があります.</font><br><br>";
    
    echo "タイトル : ";
    if(!$bConfirm[TITLE]) echo "<font color=\"red\">タイトルの入力がありません</font><br>";
    else {
      echo $_POST[TITLE]."<br>";      
    }
    
    
    echo "URL : ";
    if(!$bConfirm[URL]) echo "<font color=\"red\">URLの入力がありません</font><br>";
    else {
      echo $_POST[URL]."<br>";
    }
    
    
    echo "メール : ";
    if(!$bConfirm[MAIL]) echo "<font color=\"red\">メールの入力がありません</font><br>";
    else {
      echo $_POST[MAIL]."<br>";
    }
    //sessoin情報を使う

    echo "<br><a href=\"input.php\">戻る</a>";
  }

  
  //最後にPOST変数の全てに入っていなくても入っていてもセッションに入れる…
  $_SESSION[URL] = $_POST[URL];
  $_SESSION[TITLE] = $_POST[TITLE];
  $_SESSION[MAIL] = $_POST[MAIL];



  //文字が変数に入っているか判定する関数
//・・・
  function containsChar( $sPost ){
    $bConfirm = TRUE;
    //$choppedChars = chop($sPost);
    if(!(isset($sPost)) || $sPost == "") {
      $bConfirm = FALSE;
    }
    return $bConfirm;
  }


?>

</body>
</html>

セッションを使用するためにはまず最初

session_start();

を呼び出す必要があります.

呼び出した後は,$_SESSION変数に値を入れるだけで,ページが移り変わっても$_SESSION変数のデータを保持することが出来ます.(ただし,次のページでもsession_start()を呼び出す必要があります)

入力ミスなどで,confirm.phpからエラーでinput.phpに戻ってしまった場合,$_SESSION(confirm.php のソースコードの )変数を利用して,ユーザの入力した内容を保持し,input.phpのフォームに表示(input.phpのソースコードの )します.
これにより,エラーの原因でない部分について再度入力する手間を省いています.

真ん中にあるhtmlspecialchars関数はユーザが入力した内容に特殊文字がある場合,htmlエンティティに変換します.
(ex. &→&amp;)

では自分で定義した関数を利用しています.関数を利用すると同じ様な内容のソースを何度も書く必要がなくなります.
関数についてはこちらをご覧ください.

最後に登録完了を知らせる,regist.phpを呼び出し,$_SESSIONの内容をデータベースに保存します.

<html>
<body>
登録が完了しました.<br><br>
<?php
  session_start();

  require_once "definition.php";

  echo "<b>〇登録内容</b><br>";
  echo "タイトル : ".htmlspecialchars($_SESSION[TITLE], ENT_QUOTES)."<br>";
  echo "URL : ".htmlspecialchars($_SESSION[URL], ENT_QUOTES)."<br>";
  echo "メール : ".htmlspecialchars($_SESSION[MAIL], ENT_QUOTES)."<br>";

  echo "<br>ご登録ありがとうございました.<br><br>";
  echo "<a href=\"./input.php\">入力フォームに戻る</a>";

  $sTitle = addslashes($_SESSION[TITLE]);
  $sUrl = addslashes($_SESSION[URL]);
  $sMail = addslashes($_SESSION[MAIL]);

  //DBへの操作
  mysql_connect("127.0.0.1", "ユーザ名", "パスワード");
  mysql_select_db("データベース名");
  $result = mysql_query("insert into テーブル名 values( '$sTitle', '$sUrl', '$sMail' )");
  
  session_destroy();
  ?>
</body>
</html>

一番最後のsession_destroy()関数を使うと今使っている$_SESSION変数を破棄します.これを呼ばずに余計なデータを残すと,システムの脆弱性の原因になる可能性があります.セッションの利用が終わったらしっかり呼びましょう.

セッションを利用する方法は他にもいくつかあります.是非調べてみてください!

↑項目に戻る

PHP Top