質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1180閲覧

メール送信フォームを戻らなくしたい

kazu_jc

総合スコア18

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/12/13 07:38

前提・実現したいこと

自分のアップしたwebsiteから、お問合せフォームを送る
インターフェースが欲しくて、テキストを購入し、下記のような
サンプルコードがあり、実際送信してみました。
送信はできたのですが、IEの“戻る”ボタンで
入力フォームに戻れてしまいます。なので、
戻る→送信→戻る→送信と、同じ内容を
何度も(やろうと思えばですが)できてしまいます。

echo ' メールを送信しました ';

が表示された後、ソースコードを入れて、元のホームページに飛ぶ
(できたら5秒後とか)もしくは、戻るボタンを押すとエラー表示に
なるようにできますか?

宜しくお願い致します。

発生している問題・エラーメッセージ

いま、問合せフォーム → 確認ページ → echo ' メールを送信しました 'ページ になりますが、戻るボタンで『確認ページ』がエラー表示されている場合でも、 もう一度戻るボタンを押すと『問合せフォーム』に戻れてしまいます。 それで、また送信までたどり着けてしまいます。

該当のソースコード

php

1<?php 2session_start(); 3?> 4<!DOCTYPE html> 5<html lang="ja"> 6<head> 7<meta charset="utf-8"> 8<title>メール送信</title> 9</head> 10<body> 11<?php 12mb_language("Japanese"); 13mb_internal_encoding("UTF-8"); 14 15$to = 'mail@example.com'; 16$subject = '入力フォームからの送信'; 17$body = 18 '名前:' . $_SESSION['handle'] . "\n" . 19 'メールアドレス:' . $_SESSION['email'] . "\n" . 20 '性別:' . $_SESSION['sex'] . "\n" . 21 '年齢:' . $_SESSION['age'] . "\n" . 22 '機器:' . implode(',', $_SESSION['device']) . "\n" . 23 '感想他:' . $_SESSION['opinion'] . "\n"; 24 25$result = mb_send_mail($to, $subject, $body); 26 27if ($result) { 28 echo ' メールを送信しました '; 29} else { 30 echo ' メール送信に失敗しました '; 31} 32session_destroy(); 33?> 34</body> 35</html>

ここにより詳細な情報を記載してください。

Windows10、IE11でテストしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

下記のスクリプトを追加することで、一応解決しました。

<script type="text/javascript"> history.pushState(null, null, null); window.addEventListener("popstate", function() { history.pushState(null, null, null); }); </script>

『「戻る」ボタンが押されるとpopstateからイベントハンドラが実行され、自分自身を指す履歴(history.pushState(null, null, null))がもう一つ追加される。

ページ読み込み時に実行されるhistory.pushState()では、最初に「戻る」が実行されたときに戻る先の履歴が追加され、2回目以降の「戻る」実行時はイベントハンドラで追加される履歴が使用される』

とのこと。送信フォームから入力フォームに戻れなくなったので、
とりあえず、個人のwebsiteとしては、良いのかなと。
ただ、送信フォームには戻れるので、戻る → ホームを繰り返すと
空メールがその度、送信されてしまった。

なので、入力フォームは全て入力しないと、進めないので
名前セッションが空なら、メールは送信できません。

よって
if (isset($_SESSION['name'])) {
// nameが空でないならメール送信
$result = mb_send_mail($to, $subject, $body);
}

でメール送信にしたら、空メールもなくなりました。

phpは初心者で、教科書も少ないため、私はこの方法を
取りました。

まあ、故意にいたずらしようとしたら分かりませんが、
そこまでのサイトではないので、個人のwebsiteとしては、
やりたいことはできた感じです。

ありがとうございました。

投稿2018/12/17 00:51

編集2018/12/17 00:54
kazu_jc

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

基本的には「戻る」(いわゆるブラウザバックという機能)際の動作を保障しないというのがWebの基本スタンスです。
ただ、現在直面されている問題については、Webのセキュリティ脅威の1つであるCSRFというものにあたります。

代表的な対策として「トークンを埋め込んで照合」というのがありますので、下記の記事など参考に試してみてください。

投稿2018/12/13 07:50

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu_jc

2018/12/13 08:13

たびたび、ありがとうございます。 トークンによる対策で再送しないようにする、という考えですね。 お手数おかけしますが、 『とっても簡単なCSRF対策』 の クラス定義の部分は これを<head>・・・  </head> の部分に埋め込むのでしょうか?
kazu_jc

2018/12/13 08:16

あるいは、単純に数秒後にページを変えてしまう、というコマンドはありますでしょうか?? header('Location: http://', true, 302);みたいなのは使えないでしょうか? 初歩的で申し訳ないです。
m.ts10806

2018/12/13 08:26

> クラス定義の部分は 別ファイルに作ってincludeしてください。 全て1ファイルに書く必要はなく、役割に応じてファイルをわけて必要に応じて読み込むのが開発のやり方です。 > header('Location: http://', true, 302);みたいなのは使えないでしょうか? 自前で試してないですが、ブラウザバック使えるはずです。 試してみてください。 というか、リダイレクトはあまり根本的な対策になっていないです。
kazu_jc

2018/12/13 08:32

ありがとうございます。確かにどこまでも戻れば、戻れてしまいます。 少し、試行錯誤、試してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問