PHPでメールフォームを作る

ついにメールフォームを作成します!
このあたりからPHPを駆使していきますね。

メールフォーム用のHTMLを作成

準備中としていたinquiry.phpを、以下のように修正します。

inquiry.php
<?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";?>

以下は各行の説明です。

<form action="inquiry.php" method="post">

formタグによって、以降のinputタグに入力された値を送信します。
「送信する」ボタンが押されると、formタグに囲まれた範囲の入力項目がセットになって、指定されたページに飛ばされます。
“inquiry.php”(自分自身のページ)へ、”post”方式で送信するという記述になります。
なお、主なmethodには「post」と「get」があります。こういったフォーム送信については、まずは「post」で行うと覚えておいてください。

        お名前<br>
        <input type="text" name="uname" size="30">

inputタグとtype=”text”の指定により、テキスト入力フォームが表示されます。
name=”uname”という指定により、入力された値はunameという名前で送信されます。

        お問い合わせ内容<br>
        <textarea name="body" rows="5" cols="20"></textarea>

textareaタグは、複数行のテキストを入力するための入力項目を表示します。
name=”body”という指定により、入力された値はbodyという名前で送信されます。
rows=”5″は入力枠の行数が5行であることを意味します。
cols=”20″は入力枠の幅が20文字であることを意味します。

<input type="submit" name="send" value="送信する">

type=”submit”と指定されたボタンをクリックされると、formの中身を送信します。
name=”send”という指定により、value値(「送信する」という文字列)はsendという名前で送信されます。

上記のinquiry.phpを表示すると、以下のようになります。

step1-050-1

上記を一括ダウンロード [step1-050.zip]

送信した値を確認

さて、「送信する」ボタンを押したあと、値はどこに飛ばされてくるのでしょうか。
それはformタグに書かれた、action=”inquiry.php”に答えがあります。
今回のケースでは、送信された値は自分自身である、「inquiry.php」に飛んでくるわけです。
そこで、送信するデータを確認するために、ブラウザの開発者ツールを利用してみます。

開発者ツールの起動

はじめに、ブラウザから先ほど作成したinquiry.phpをApache経由で表示します。
表示されたら、キーボード奥側の、「F12キー」を押してください。すると開発者ツールが表示されます。
今回はInternet Explorler 11での例になりますが、最近のブラウザならほぼ同じ手順になります。
開発者ツールが表示されたら、「ネットワーク」タブを開き、通信内容のキャプチャを開始します。キャプチャを開始すると、以降の通信内容が記録されるようになります。

step1-050-2

キャプチャ実行

フォームに値を入力したら、「送信する」ボタンを押します。
すると、開発者ツールに送信内容が記録されます。
結果一覧の中から、inquiry.phpの行をダブルクリックします。

step1-050-3

通信内容の確認

上記に続いて、「詳細」「要求本文」を選択します。
すると、postされた通信内容が表示されます。
データはエンコードされて、一連の文字列になってサーバに送信されたわけです。

step1-050-4

Apacheのログ確認

ついでに、Apacheのログも見てみましょう。
C:\xampp\apache\logs\access.log
をテキストエディタで開いて一番下の行を確認します。
すると、

::1 - - [02/Apr/2016:19:40:21 +0900] "GET /step1-050/style.css HTTP/1.1" 200 108 "http://localhost/step1-050/inquiry.php" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"

こんな感じで記録されているのがわかります。
前述の「開発者ツール」ではブラウザサイドからの確認であるのに対して、Apacheのログ表示については、サーバサイドでの確認になります。
この両者を活用することで、行き詰まったときのヒントになります。

PHPでの確認

プログラムの上部に、

<?php var_dump($_REQUEST);?>

を記載することで、送信されてきた値をダンプ出力することができます。
上記を記載して「送信する」ボタンを押してみてください。
以下のような結果が表示されます。

step1-050-5

inquiry.php
<?php var_dump($_REQUEST);?>

<?php $page_title = "お問い合わせ";?>
<?php require "header.php";?>
    <p>
      お問い合わせは以下よりお願いします
    </p>
    ・・・・・・

また、ダンプ内容が読みづらいようでしたら、ブラウザの操作で「ソースを表示」をすると、わかりやすくなります。ソースの表示については、画面上で右クリックをするとメニューが出てきますので、その中から「ソースの表示」を選ぶと行えます。
今回var_dump関数によってダンプされているのは、$_REQUESTという配列型(array)の変数です。
通常の数値型や文字列型の変数では1つの値しか格納できませんが、配列型では、複数の値を格納することができます。

array(4) {
  ["uname"]=>
  string(12) "山田太郎"
  ["email"]=>
  string(16) "test@example.com"
  ["body"]=>
  string(41) "こんにちは!
はじめまして!"
  ["send"]=>
  string(12) "送信する"
}

PHPに渡されるパラメータ

postやgetメソッドで値が送信されると、PHPでは値をスーパーグローバル変数に展開し、プログラムで利用できる状態になります。

スーパーグローバル変数

PHPではスーパーグローバル変数というものがあり、この変数はプログラムのどこからでも呼び出せます。
前述の例で使った「$_REQUEST」という変数もスーパーグローバル変数です。
PHPのプログラムでは、ユーザーが送信した値をスーパーグローバル変数などから取り出して、メール送信に使ったり、データベース登録に使ったりします。
スーパーグローバル変数は、主要なものに以下のようなものがあります。

$_POST

postメソッドで送信されてきた値が格納されます。

$_GET

getメソッドで送信されてきた値が格納されます。

$_COOKIE

クッキーで送信されてきた値が格納されます。

$_REQUEST

$_POST/$_GET/$_COOKIEの結果が合わさった値が格納されます。

$_SESSION

セッションの値が格納されます。

$_SERVER

Webサーバの情報が格納されます。

getメソッドについて

上記ではpostメソッドを例にしていますが、getメソッドを利用することができます。
getメソッドは、送信値をURLに含める形で表現したデータ送信方法です。

postではなくgetで送信するように修正

inquiry.phpのformタグを以下のように修正します。

<form action="inquiry.php" method="get">

ブラウザから送信

上記に修正したら、フォームに値を入力して、「送信する」を押します。
すると、URL欄に値が入ってきます。
それでも、$_REQUESTに入ってくる値は同じです。
URLに含めた値を取得するケースはありますが、『わざわざアプリケーションで、フォーム値をgetで送信する』というケースはあまりありません。

step1-050-6

このページをシェア Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn