PHP お問い合わせフォームの自作②
今回はWordPressなどに頼らず自作のPHPコードでHTMLを編集して
お問い合わせフォームを作成していきます。
前回からの続きで
お問い合わせの確認画面の作成
index.php の最初のエラーチェックの項目の最初に記述します。
session_start();
これでセッション変数を使用できるようにし
画面遷移でセッションが切れた後も値が保持できるように
最初のエラーチェックの項目の最後に記述します。
if (count($error) === 0) {
//エラーがないなら確認画面に移動する
$_SESSION['form'] = $post;
header('Location: confirm.php');
exit();
}
$_SESSION[‘form’] = $post;でこのページで受け取った値を変数に入れて
header(‘Location: confirm.php’);で確認ページに遷移するようにします。
confirm.phpの部分で絶対もしくは相対パスでリダイレクトするファイル先を指定します
最後にexit();でプログラムを終了しています。というのも
この関数、特定条件でうまく動作しないことがあるらしくその条件とは、
- 前後でechoやprintを書いていないか
- ファイル頭のphpタグの前に空白・改行が混じってないか
- header関数を呼んだ後、すぐにexit関数で処理を終了しているか
ということもあり忘れずに記述してエラー回避しましょう
confirm.php を作成する
次にお問い合わせの確認ページの記述です
先頭に先程定義したセッション変数を宣言し
受け取るようにします
<?php
session_start();
$post = $_SESSION['form'];
?>
そして各欄に受け取った値を表示できるようにします
<?php echo htmlspecialchars($post['name']); ?>
‘name’の部分は各値に適宜変更します
ただし改行が入るようなテキストの場合は
<?php echo nl2br(htmlspecialchars($post['contact'])); ?>
nl2br()で囲ってやることで改行があった場合に
自動で<br>タグにしてくれるようにしておきます
確認画面が直接呼び出された場合の対策
ブラウザを閉じられてしまったりして確認画面が
リロードされてしまうと入力欄が空で動作してしまうので
これに対処するため
条件分岐を追加します。
session_start();
if(!isset($_SESSION['form'])) {
header('Location: index.php');
exit();
} else {
$post = $_SESSION['form'];
}
if(!isset($_SESSION[‘form’]))の部分でセッション変数に
値がセットされているか確認し、なければ元のページに返ってくるようにしました
「戻るボタン」で戻ってきた場合に値をセットしておく
確認画面には戻るボタンを設置しておきますが
こちらで戻ってきた場合は入力内容が空になってしまっています。
なのでこちらもセッション変数を用いて条件分岐させてあげます
index.phpへ戻ります。
if($_SERVER['REQUEST_METHOD'] === 'POST') {
※一部省略
} else {
if(isset($_SESSION['form'])) {
$post = $_SESSION['form'];
}
}
リクエストメソッドがPOSTであった場合の処理が書かれているところに
戻るボタンで来た際はこのページはGETで呼び出される事になるため、
ここにelse{}で追記します。セッション変数に値がセットされているか確認してvalueにセットするために変数を代入します
さて、ではconfirm.php を仕上げていきましょう
送信できるように変数に入れる
<form action="" method="POST">
confirm.phpもaction属性は自身にするため空にしておきます。
if($_SERVER['REQUEST_METHOD'] === POST) {
//メールを送信する
}
上のフォームを送信したらという意味で再び
リクエストメソッドを判定して送信します
中身としては、、
$to = 'youthfulday.8348@gmail.com';
$from = $post['email'];
$subject = 'お問い合わせが届きました。';
$body = <<<EOT
名前:{$post['name']}
メールアドレス:{$post['email']}
内容:
{$post['contact']}
EOT;
$toは宛先、$formは送信相手、$subjectは表題、
$bodyはヒアードキュメントでこの内容をそのまま変数に入れています。
mb_send_mail($to,$subject,$body,"From: {$from}");
上でまとめた変数をこれで送信できます。
送信したらセッションを削除してからにしよう
unset($_SESSION['form']);
header('Location: thanks.html');
exit();
unsetで削除してお礼画面へ移動します。
最後にできたコードを見てみます
index.php
<?php
session_start();
$error = [];
//フォーム送信時にエラーを確認する
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if ($post['name'] === '') {
$error['name'] = 'blank';
}
if ($post['email'] === '') {
$error['email'] = 'blank';
} else if (!filter_var($post['email'], FILTER_VALIDATE_EMAIL)) {
$error['email'] = 'email';
}
if ($post['contact'] === '') {
$error['contact'] = 'blank';
}
if (count($error) === 0) {
//エラーがないなら確認画面に移動する
$_SESSION['form'] = $post;
header('Location: confirm.php');
exit();
}
} else {
if(isset($_SESSION['form'])) {
$post = $_SESSION['form'];
}
}
?>
confirm.php
<?php
session_start();
if(!isset($_SESSION['form'])) {
header('Location: index.php');
exit();
} else {
$post = $_SESSION['form'];
}
if($_SERVER['REQUEST_METHOD'] === 'POST') {
//メールを送信する
$to = 'youthfulday.8348@gmail.com';
$from = $post['email'];
$subject = 'お問い合わせが届きました。';
$body = <<<EOT
名前:{$post['name']}
メールアドレス:{$post['email']}
内容:
{$post['contact']}
EOT;
// var_dump($body);
// exit();
mb_send_mail($to,$subject,$body,"From: {$from}");
//セッションを消してお礼画面へ
unset($_SESSION['form']);
header('Location: thanks.html');
exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
コメントをお待ちしております