はじめに
今回からフォームでのPHPの使い方を取り上げていきたいと思います。
フォームというのは、Webサイトでよく見かけるお問い合わせフォームや予約フォームのことをさします。
例えばお問い合わせフォームですと、閲覧者が必要な情報を入力および送信した後、その情報をデータベースに登録し、管理者へメールを自動送信するなどシステムの裏では動きがありますが、それらにはPHPが関係しています。
そのフォームとPHPがどのように連携しているのか、必要な部分をピックアップしていこうと思います。
フォームに入力した情報を受け取る
ここからはユーザーがフォームに入力した情報を受け取り、ブラウザに表示するということをしていこうと思います。
今回はフォームを作る必要がありますのでHTMLファイルが必要になります。
新たにフォルダを作り、その中にindex.htmlを作っていきます。
今回は「form」というフォルダの中にindex.htmlを作成しました。
index.htmlにコードを入力していきましょう。
こちらの記事ではPHPについて取り上げていますので、HTMLのコードについては簡単に触れるぐらいにします。
今回はとても簡単なコードですが、まずは以下のように入力します。
保存しましたらブラウザで表示を確認してみます。
上の画像のように表示されていましたら問題ありません。
ただ入力欄に何か入力し、「送信する」ボタンをクリックしてもNot Foundというページになってしまいます。
先ほど入力しましたタグ内にactionを設定しましたが、そちらで「送信する」ボタンをクリックした後に表示されるページの名前を指定します。
今回の場合ですとsubmit.phpというファイルを指定していますが、作成していないため「送信する」をクリックするとNot Foundになりました。
そこで今度はsubmit.phpを作ってみましょう。
先ほど作成したindex.htmlと同じ階層に作ります。
まずはsubmit.phpに、以下のように入力し、表示を確認してみます。
保存し、ブラウザで表示を確認してみますと以下のようになります。
現在は、「お名前:」の後に「テスト 太郎」と固定で指定しているため入力欄に何を入力しても「テスト 太郎」です。
こちらを入力欄に入力した名前が表示されるように書き換えてみます。
「テスト 太郎」を消し、<?php echo $_REQUEST[‘my_name’]; ?>と入力します。
上書き保存をし、ブラウザで入力欄のページを開きます。
入力欄に何でもいいので入力し、「送信する」ボタンをクリックしてみましょう。
するとsubmit.phpの画面に遷移します。
以下のように入力した内容が表示されていましたら問題ありません。
入力した内容が表示されていますが、こちらは先ほどsubmit.phpに入力した<?php echo $_REQUEST[‘my_name’]; ?>によってそのように動いています。
$_REQUESTは、フォームから送信されたデータを受け取ります。
そして$_REQUESTの後にカッコ[]を付けて、配列で受け取る情報を指定します。
今回の場合ですとmy_nameとなり、index.htmlに入力しました入力欄の<input>内にありますname属性を指定します。
ただフォームを扱う際は、安全性を考慮しなくてはいけません。
上記の方法ですとウイルスなどプログラムを入力欄に入れられ送信されたりしますと情報を盗まれたり危険な状態になってしまいます。
そこで上記のプログラムを少し変えます。
先ほどの$_REQUEST部分を以下のように追記してみます。
——————
<?php echo htmlspecialchars($_REQUEST[‘my_name’], ENT_QUOTES); ?>
——————
もし入力欄にタグなどプログラムを入力されても、ブラウザにそのまま表示されるようになりました。
htmlspecialchars()で囲むことで、入力されたHTMLのような特殊文字を変換し、そのまま出力します。
そしてさらにENT_QUOTESを指定することで、シングルクォーテーションとダブルクォーテーションも変換され出力されます。
では、今の状態で何も入力しないで送信した場合はどうなるでしょうか。
送信後のページで名前の項目は空白になります。
こちらあまりよくないですので、if文を使って何も入力されなかった場合はsubmit.phpも何も表示されないようにしてみます。
先ほどのecho部分をif文で囲んであげます。
——————
<?php if(!empty($_REQUEST[‘my_name’])): ?>
<?php echo htmlspecialchars($_REQUEST[‘my_name’], ENT_QUOTES); ?>
<?php endif; ?>
——————
上書き保存をし、ブラウザで表示を確認してみましょう。
入力欄に何かを入力し「送信する」ボタンをクリックしますとこれまで通り、submit.phpのページに入力したものが表示されます。
それでは未入力で「送信する」ボタンをクリックしてみますとどうでしょうか。
先ほど入力したif文で、入力欄が空じゃない場合に入力した情報を表示させるようにし、それ以外の場合は表示させないようにしました。
そのためsubmit.phpページは、真っ白になります。
参考:PHP $_REQUEST(リクエスト変数)のすべて!【初心者向け基本】
参考:$_REQUEST
参考:PHPのhtmlspecialcharsを使いこなす
GETとPOST
先ほど作ったindex.htmlを開き、タグを確認してみましょう。
するとmethod(メソッド)という属性があり、そこに今回はgetが指定されています。
メソッドにはgetとpostがあり、メソッドを指定しないと自動的にgetになります。
GET
メソッドにgetを指定した場合、submit.phpページのURLの最後に入力欄に入力した内容が入ります。
例えば以下のように入力欄にあいうえおと入力し、「送信する」ボタンをクリックしますとsubmit.phpページのURLの最後に、あいうえおが入っているのが確認できます。
メリット
パラメーターに入力した内容が表示されることにより、そのURLをSNSなどでシェアすることが出来ます。
GETが使用されているものの1つとしてGoogleなどの検索機能があります。
デメリット
デメリットとしては、入力欄にパスワードなどの重要な情報を入力する際にはセキュリティの面でリスクがありますので向きません。
またメッセージなどの長文を送信する際にもURLが長くなってしまいますので、このような場合は次で取り上げますPOSTで送信します。
POST
メソッドにpostを指定した場合、getの時とは違いURLには入力した情報が入りません。
しかし裏側で情報が送信されています。
メリット
GETとは逆になりますが、パスワードや長文のメッセージを送信する際は、パラメーターに入らず送信されるので向いています。
デメリット
こちらもGETとは逆になりますが、URLで情報をシェアしたり、ブックマークするといったことには向きません。
情報の受け取り
GETとPOSTでは、PHP側も情報の受け取り方が変わります。
index.htmlのformタグのメソッドをgetにし、先ほど作成したsubmit.phpを開きます。
そしてまずは$_REQUESTとなっているところを$_GETにします。
——————
<?php if(!empty($_GET[‘my_name’])): ?>
<?php echo htmlspecialchars($_GET[‘my_name’], ENT_QUOTES); ?>
<?php endif; ?>
——————
この状態で一度、上書き保存をしブラウザで表示を確認してみます。
入力欄に何かを入力しますとsubmit.phpページで、入力した情報が表示されパラメーターにも含まれます。
メソッドをgetにしているので正しく情報を受け取っているのが確認できます。
それでは次にindex.htmlのメソッドをpostに変更してみます。
再度、上書き保存をし入力欄に入力し「送信する」ボタンをクリックしてみますと、何も表示されず情報を受け取ることが出来ていないことが確認できます。
そこでsubmit.phpも$_POSTにしてみます。
するとpostで入力した情報を受け取ることができます。
このようにgetで送信した情報は$_GETで、postで送信した情報は$_POSTで受け取ります。
ただ最初に入力していました$_REQUESTは、getやpostで送信されても情報を受け取ることができる汎用性の高いグローバル変数です。
しかしpostで送信した情報を$_REQUESTで受け取ると少し問題があります。
index.htmlのformタグのメソッドをpostにし、submit.phpは$_REQUESTで情報を受け取ってみます。
ブラウザで入力欄に何かを入力し「送信する」ボタンをクリックしますと、postで情報を受け取れますが、URLの最後に例えば?my_name=ウイルスを追加してみます。
そしてエンターキーを押しますと、情報が書き換わってしまいます。
$_REQUESTはgetとpostの両方の情報を受け取ることが出来ますが、このような問題もありますので、なるべくpostで送信する情報は$_POSTで受け取った方が良いです。
まとめ
フォームについて取り上げましたがいかがでしたでしょうか?
フォームは大切な情報を送ることが多いですので、よりセキュリティについて考えていかなくてはいけません。
こちらの記事がきっかけで情報のセキュリティについても興味を持っていただけましたら幸いです。