フォームから値が送信されてくることが確認できたところで、この値をメールで送信したいと思います。
新しい技術が色々出てきますが、がんばっていきましょう。
if文の利用
ここで基本的な制御構文のひとつである、if文の説明をします。
if文について
プログラムを作っていく上で、様々なタイプのif文を利用することになります。
<?php $param = 1; if ($param == 1) { echo "1です"; } else if ($param != 0) { echo "0以外です"; } else { echo "値はありません"; }
これが基本形です。
上記の例ではまず、「if ($param == 1) {」が評価されます。もし$paramが1の場合「1です」が表示されます。(上記では当然1になるわけですが)
次に、「} else if ($param != 0) {」が評価されます。
もし$paramが0以外だった場合「1以外です」が表示されます。
最後に、「} else {」が評価されます。
いずれの条件にも該当しなかったため「値はありません」が表示されます。
(else ifは複数書くことができますが、ifとelseは一連の構文で一回のみ使えます)
他のパターンとして、以下のように記載することもできます。
else ifがないケース
<?php $param = 1; if ($param == 1) { echo "1です"; } else { echo "値はありません"; }
ifのみのケース
<?php $param = 1; if ($param == 1) { echo "1です"; }
評価式
if文では、評価式を使って値を評価し、真(true)か偽(false)を決定します。
以下の例はすべて「真」が出力されます。
==(イコール)
両者が同じ場合に真とします。
<?php $param1 = 1; $param2 = 1; if ($param1 == $param2) { echo "真"; } else { echo "偽"; }
&&(AND=両方がtrue)
両者が真の場合に真とします。
<?php $param1 = true; $param2 = true; if ($param1 && $param2) { echo "真"; } else { echo "偽"; }
※trueとは真を現します。一方、falseとは偽を現します
||(OR=どちらかがtrue)
どちらかが真の場合に真とします。
<?php $param1 = true; $param2 = false; if ($param1 || $param2) { echo "真"; } else { echo "偽"; }
!=(不一致)
両者が違う場合に真とします。
<?php $param1 = "abc"; $param2 = "def"; if ($param1 != $param2) { echo "真"; } else { echo "偽"; }
変数のみ
変数が真の場合に真とします。
<?php $param1 = true; if ($param1) { echo "真"; } else { echo "偽"; }
変数のみ(偽)
変数が偽の場合に真とします。
<?php $param1 = false; if (!$param1) { echo "真"; } else { echo "偽"; }
===(厳密なイコール)
いずれ詳しく説明しますが、ここでは、『==が厳密になったバージョン』と覚えておいてください。
!==(厳密な否定)
いずれ詳しく説明しますが、ここでは、『!=が厳密になったバージョン』と覚えておいてください。
if文を使って送信モードを判別
inquiry.phpが起動したとき、「送信ボタンが押されて表示されたかケース」「トップページからのリンクなどで表示されたケース」の2種類を判別しようと思います。
そこで、PHPの制御構文であるif文を利用します。
プログラムの修正
まずはinquiry.phpの一番上に追記してください。
<?php if (isset($_REQUEST["send"])) { echo "送信モードです<br>"; var_dump($_REQUEST); } ?>
全体では以下のようになります。
<?php if (isset($_REQUEST["send"])) { echo "送信モードです<br>"; var_dump($_REQUEST); } ?> <?php $page_title = "お問い合わせ";?> <?php require "header.php";?> <p> お問い合わせは以下よりお願いします </p> <form action="inquiry.php" method="post"> <div> お名前<br> <input type="text" name="uname" size="30"> </div> <div> メールアドレス<br> <input type="text" name="email" size="30"> </div> <div> お問い合わせ内容<br> <textarea name="body" rows="5" cols="20"></textarea> </div> <div> <input type="submit" name="send" value="送信する"> </div> </form> <?php require "footer.php";?>
値を送信して確認
上記の修正を行ってからフォーム送信を行うと、画面に以下が表示されます。
if文の中に入っているのがわかります。
なお、isset(xxx)というのは、ある変数が定義されているかをチェックする関数です。
関数について
関数とは、『ある別の処理を呼び出す構文』であり、『結果を取得することができる構文』でもあります。
前述の、『isset』『var_dump』のどちらも関数にあたります。
ここでは関数について説明したいと思います。
関数の使い方
大きく分けて、『戻り値がある関数』『戻り値がない関数』の2種類があります。
(PHPのマニュアルなどで、戻り値がvoidとなっているものが、戻り値がない関数となります)
戻り値のあるケース
<?php $param = 1; $result = isset($param); if ($result) { echo "定義されています"; }
issetは、ある変数が定義されているかを調べる関数です。
上記の場合は、$resultへはtrueが入ります。
なお、戻り値を変数に入れない形で関数を呼び出すこともできます。
戻り値がないケース
<?php $param = 1; var_dump($param);
var_dumpは、ある変数の中身を出力する関数です。
上記の場合は、ダンプが行われるだけで、戻り値はありません。(そのため、結果を変数に代入する必要はありません)
関数の種類
組み込み関数
PHPに標準で組み込まれた関数になります。
PHP自体のバージョンや設定によって、利用できるものが変わってきます。
ユーザー関数
オリジナルで定義した関数です。
インターネットなどで配布されているライブラリなども、ユーザー関数という扱いになります。
<?php function test_function($str){ echo $str; return true; } $result = test_function("abc"); // abcが画面に出力され、$resultにtrueが入る
上記は$strという変数を受け取ったのち、$strを画面に出力し、結果としてtrueを返すユーザー関数のサンプルです。
引数について
<?php $param = 1; $result = isset($param); if ($result) { echo "定義されています"; }
この例ではisset関数に$paramという変数を渡していますが、関数に渡す値のことは、引数と呼びます。複数の引数を渡す場合は、左端から、第一引数、第二引数などと表現します。(今回は、第一引数に$paramを渡しています)
配列について
配列についても触れておきます。
配列型の変数を使うことで、ひとつの変数に複数の値を持たせることができます。
配列の定義方法
$_REQUESTなどのスーパーグローバル変数の場合は自動で設定されてきますが、自分で配列を定義することもできます。
配列を定義するには、以下のような構文を使います。
一括での定義方法
<?php $array = array( "uname" => "山田太郎", "email" => "test@example.com", );
配列初期化後に値を追加する方法
<?php $array = array(); $array["uname"] = "山田太郎"; $array["email"] = "test@example.com";
連想配列と通常の配列
上記は『連想配列』と呼ばれる配列の使い方になります。
PHPでは連想配列を使う機会が多いのですが、通常の配列を使う場合もあります。
通常の配列は、『文字列』の添え字ではなく、『数値』の添え字を使います。
また、数値を省略することもできます。
一括での定義方法
<?php $array = array( 0 => "山田太郎", 1 => "test@example.com", ); $array = array( "山田太郎", "test@example.com", );
配列初期化後に値を追加する方法
<?php $array = array(); $array[0] = "山田太郎"; $array[1] = "test@example.com"; $array = array(); $array[] = "山田太郎"; $array[] = "test@example.com";
配列の利用方法
配列の添え字を指定することで、配列の値を取り出すことができます。
"山田太郎", "email" => "test@example.com", ); echo $array["uname"]; // 山田太郎 と出力されます
多次元配列
配列は二次元だけでなく、三次元、四次元などと、多次元にできます。
$_REQUESTなどのスーパーグローバル変数も二次元配列です。
<?php $fruits = $array( "apple" => array( "name" => "りんご", "color" => "red", ), "banana" => array( "name" => "バナナ", "color" => "yellow", ), "lemon" => array( "name" => "レモン", "color" => "yellow", ), ); echo $fruits["apple"]["name"]; // りんご が表示される
上記は二次元配列の例です。
メール送信の実行
実際のメール送信処理の実装を行っていきます。
プログラムの修正
inquiry.phpを以下のように修正してください。
また、ソースコード内の$admin_emailにあなたのメールアドレスを代入してください。
$admin_email = "own@example.com";
(mailtodiskを有効にしてあれば、メールの内容がファイルシステムに保存されるだけですが)
<?php $page_message = ""; // ページに表示するメッセージ if (isset($_REQUEST["send"])) { // 初期設定 mb_language("japanese"); // メール送信の際のおまじない mb_internal_encoding("UTF-8"); // メール送信の際のおまじない // 送信本文の作成 $mail_body = ""; if (isset($_REQUEST["uname"])) { $mail_body .= "[お名前]\n"; $mail_body .= "{$_REQUEST["uname"]}\n"; } if (isset($_REQUEST["email"])) { $mail_body .= "[メールアドレス]\n"; $mail_body .= "{$_REQUEST["email"]}\n"; } if (isset($_REQUEST["body"])) { $mail_body .= "[お問い合わせ内容]\n"; $mail_body .= "{$_REQUEST["body"]}\n"; } // 送信実行 $subject = "お問い合わせがありました"; $admin_email = "own@example.com"; // あなたのメールアドレスを入力してください $add_header = "From:" . $admin_email; $result = mb_send_mail($admin_email, $subject, $mail_body, $add_header); // 完了 $page_message = "送信しました!"; } ?> <?php $page_title = "お問い合わせ";?> <?php require "header.php";?> <p> <?php echo $page_message; ?> </p> <p> お問い合わせは以下よりお願いします </p> <form action="inquiry.php" method="post"> <div> お名前<br> <input type="text" name="uname" size="30"> </div> <div> メールアドレス<br> <input type="text" name="email" size="30"> </div> <div> お問い合わせ内容<br> <textarea name="body" rows="5" cols="20"></textarea> </div> <div> <input type="submit" name="send" value="送信する"> </div> </form> <?php require "footer.php";?>
今回は、mb_send_mailという関数を使ってメール送信を行っています。
詳しくはこちらのmb_send_mailの公式マニュアルをご覧ください。
それでは以下に、各行を説明します。
$page_message = ""; // ページに表示するメッセージ
送信完了時のメッセージをHTMLに出力するための変数をセット(初期化)しています。
// 初期設定 mb_language("japanese"); // メール送信の際のおまじない mb_internal_encoding("UTF-8"); // メール送信の際のおまじない
利用する言語を初期化しています。メール送信の際はおきまりで設定します。
// 送信本文の作成 $mail_body = ""; if (isset($_REQUEST["uname"])) { $mail_body .= "[お名前]\n"; $mail_body .= "{$_REQUEST["uname"]}\n"; }
はじめに、メール本文を作るための変数$mail_bodyを初期化します。
issetでの判定で入力値が存在したら、項目タイトルと値をセットしています。
// 送信実行 $subject = "お問い合わせがありました"; $admin_email = "own@example.com"; // あなたのメールアドレスを入力してください $add_header = "From:" . $admin_email; $result = mb_send_mail($admin_email, $subject, $mail_body, $add_header);
mb_send_mail関数を使ってメール送信を実行しています。
実際のサーバでしたらインターネットへメールが送信されますが、今回はローカルファイルシステムにメール文面の書かれたファイルが生成されます。
$subjectはメール件名、
$admin_emailは管理者(あなた)のメールアドレス、
$add_headerはメールに記載される送信元名(From:に続けて書く決まりです)、
になっています。
// 完了 $page_message = "送信しました!";
送信したことを伝えるメッセージを$page_messageに代入します。
<p> <?php echo $page_message; ?> </p>
送信メッセージを表示します。
$page_messageは、メール送信したときのみメッセージが代入され、初期状態では空白となります。
PHPソースのインデントについて
いまさらながらですが、PHPのインデントについて触れておきます。
プログラミングに際しては、TABでインデントする考え方と、半角スペースをつなげてインデントする考え方があります。会社やプロジェクトによって変わってきますが、当講座では『半角スペース4つ分』としています。
現在はHTMLとPHPが混在して見づらくなっていますが、最終的にはプログラムとHTMLを分離するコーディング方法にします。
メールフォームの実行
値を入力して送信すると、以下のように画面上部に『送信しました!』と表示されます。
もしエラーが表示されるようでしたら、以下のページの一番下にある、mailtodiskの設定方法について確認してください。
送信されたメールの確認
今回はmailtodiskを有効にしているため、メール送信時に書き込まれたファイルを確認します。
C:\xampp\mailoutput\
を開くと、書き込まれたファイルを確認できます。
To: own@example.com Subject: =?ISO-2022-JP?B?GyRCJCpMZCQkOWckbyQ7JCwbKEI=?= =?ISO-2022-JP?B?GyRCJCIkaiReJDckPxsoQg==?= X-PHP-Originating-Script: 0:inquiry.php From:own@example.com MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit [お名前] 山田太郎 [メールアドレス] test@example.com [お問い合わせ内容] こんにちは! はじめまして!
文字コードについてはJIS(ISO-2022-JP)での送信となっています。
その他、メール送信時特有の情報を確認することができます。
普段やりとりしているeメールでは、上記のようなデータをやりとりしているわけです。
最後に、ここまでの最終形のソースコードを添付しておきます。