PHP の授業(6日目) メールフォーム完成
PHP の授業。メールフォームがひとまず完成
※ あくまで授業の中での完成です。
他の人に参考になる内容かどうかは分かりません。
index.php
<?php require_once dirname(__FILE__).'/func.php'; // func.php を読み込む記述 $name=''; $email=''; $message = ''; // 空文字を代入して初期化する $name_error=''; $email_error=''; $message_error=''; if(isset($_SESSION['mail']['name'])){ $name = $_SESSION['mail']['name']; } // mail という配列に name を入れる if(isset($_SESSION['mail']['email'])){ $email = $_SESSION['mail']['email']; // mail という配列に email を加える } if(isset($_SESSION['mail']['message'])){ $message = $_SESSION['mail']['message']; } // mail という配列に message を更に加える if(isset($_SESSION['mail']['name_error'])){ $name_error = $_SESSION['mail']['name_error']; } if(isset($_SESSION['mail']['email_error'])){ $email_error = $_SESSION['mail']['email_error']; } if(isset($_SESSION['mail']['message_error'])){ $message_error = $_SESSION['mail']['message_error']; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>お問合せフォーム|初めてのPHP</title> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <div id="container"> <header> <h1>お問合せフォーム</h1> </header> <section> <form action="check.php" method="post"> <table> <tbody> <tr> <th><label for="name">お名前: <br> <span>(20文字以内)</span></label></th> <td><input type="text" name="name" id="name" value="<?php echo h($name); ?>" maxlength="20" size="50" placeholder="例:猫田寝子" required autofocus> <!-- required で入力必須に。outofocus で自動的にカーソルがそこに入る --> <?php if(!empty($name_error)){ echo "<span> {$name_error} </span>"; } ?> </td> </tr> <tr> <th><label for="email">Eメール: <br> <span>(25文字以内)</span></label></th> <td><input type="email" name="email" id="email" value="<?php echo h($email); ?>" maxlength="25" size="50" placeholder="例:example@example.com" required> <!-- type=email にする事で Eメールかどうかある程度判定してくれる(HTML5) --> <?php if(!empty($email_error)){ echo "<span> {$email_error} </span>"; } ?> </td> </tr> <tr> <th><label for="message">お問合せ内容: <br> <span>(150文字以内)</span></label></th> <td><textarea name="message" id="message" cols="50" rows="7" maxlength="150" placeholder="例:お問合せ内容" required><?php echo h($message); ?></textarea> <?php if(!empty($message_error)){ echo "<span> {$message_error} </span>"; } ?> </td> </tr> </tbody> </table> <input type="submit" value=" 確認 "> </form> </section> <footer> <p><small>(c) Silent Cait</small></p> </footer> </div><!-- /#container --> </body> </html>
check.php
<?php require_once dirname(__FILE__).'/func.php'; if(!isset($_POST['name']) || !isset($_POST['email']) || !isset($_POST['message'])) { header('Location:index.php'); exit; } // 値が無い場合に、index.php に飛ばす // Location:index.php のリダイレクトは、実際にサーバー上で動かす時は絶対パスにする。 // var_dump($_POST); $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $success = true; $name_error=''; $email_error=''; $message_error=''; // 空文字を代入した if(strpos($email,'@') ===false){ $email_error = 'Eメールアドレスに 「@マーク」 が含まれていません'; $success = false; } if(strlen($email)!=mb_strlen($email,'UTF-8')){ $email_error = 'Eメールアドレスに全角文字が含まれています'; $success = false; // strlen (stting length) で文字数を取得 } if(mb_strlen($name,'UTF-8')>20){ $name_error = 'お名前が長すぎます'; $success = false; // mb_strlen (multibyte string length) で、文字数を何バイトか数字で取得する } if(mb_strlen($email,'UTF-8')>25){ $email_error = 'Eメールアドレスが長すぎます'; $success = false; } if(mb_strlen($message,'UTF-8')>150){ $message_error = '本文が長すぎます'; $success = false; } if(empty($name)){ $name_error= '名前が入力されていません'; $success = false; $email_error= 'Eメールアドレスは必須項目です'; $success = false; $message_error='お問い合わせ内容は必須項目です'; $success = false; } $_SESSION['mail']['name']=$_POST['name']; $_SESSION['mail']['email']=$_POST['email']; $_SESSION['mail']['message']=$_POST['message']; $_SESSION['mail']['success'] = $success; $_SESSION['mail']['name_error'] = $name_error; $_SESSION['mail']['email_error'] = $email_error; $_SESSION['mail']['message_error'] = $message_error; if(!$success){ header('Location:index.php'); exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>お問合せ内容確認画面|PHP2日目</title> </head> <link rel="stylesheet" type="text/css" href="css/style.css"> <body> <div id="container"> <header> <h1>お問合せ内容確認画面</h1> </header> <section> <table> <tbody> <tr> <th>お名前: </th> <td> <?php echo h($name); ?> </td> </tr> <tr> <th>Eメール: </th> <td> <?php echo h($email); ?> </td> </tr> <tr> <th>お問合せ内容: </th> <td> <?php echo nl2br(h($message)); ?> </td> </tr> </tbody> </table> <p><a href="index.php"><strong>【 戻る 】</strong></a></p> <p><a href="send.php"><strong>【 送信 】</strong></a></p> </section> <footer> <p><small>(c) S.S</small></p> </footer> </div><!-- /#container --> </body> </html>
send.php
<?php require_once dirname(__FILE__).'/func.php'; // この一行を記述し func.php を読み込むんで func.php の内容を実行 /*var_dump($_SESSION['success']); exit; エラーチェックに使うソース*/ if(!$_SESSION['mail']['success']){ header('Location:index.php'); exit; } $name = $_SESSION['mail']['name']; $email = $_SESSION['mail']['email']; $message = $_SESSION['mail']['message']; $_SESSION = array(); // 配列に対して array() をかけると 配列が空になる unset($_SESSION['mail']); // unset 一旦できた器を壊す関数 if(isset($_COOKIE[session_name()])) { setcookie(session_name(),'',time()-42000,'/'); } // session_name セッションの名前を取得 // '' コンテンツの中身を空にするために空文字に // time()-42000 現在の時刻を取得し、記録、過去の時間を設定し、クッキーの有効期限を失効にする session_destroy(); // セッションの関連性を断ち切る関数 $body = <<<MBODY {$name} 様より お問合せメールが送信されました。 内容は以下の通りです。 ──────────────────── {$message} ──────────────────── メールアドレス: {$email} ──────────────────── MBODY; // インデントなどのスペースは入れない。 // 改行は改行として反映する。 // <<<MBODY ~ MBODY; を「ヒアドキュメント」と言う // MBODY は任意の文字列でOK。始まりと終わりの文字列の一致は必要。 mb_send_mail('silentcait@gmail.com','【PHP】お問合せメール',$body); // http://felica-portfolio.com/user11/mail0316/ ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>メール送信終了|send.php</title> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <div id="container"> <h1>メール送信終了</h1> <p>以下の内容でメールが送信されました。</p> <p>お問合せありがとうございました。</p> <table> <tbody> <tr> <th>お名前: </th> <td> <?php echo h($name); ?> </td> </tr> <tr> <th>Eメール: </th> <td> <?php echo h($email); ?> </td> </tr> <tr> <th>お問合せ内容: </th> <td> <?php echo nl2br(h($message)); ?> </td> </tr> </tbody> </table> <p><a href="index.php">トップに戻る</a></p> </div><!-- /#container --> </body> </html>
func.php
<?php /* 繰り返し記述が出てくる記述をこのファイルに記述し、 require_once dirname(__FILE__).'/func.php'; の記述でこのファイルを呼び出す */ function h($str){ return htmlspecialchars($str,ENT_QUOTES,'UTF-8'); } // h() //→自作関数、ユーザー定義関数 と言う session_start(); ?>