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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

905閲覧

WordPressに自作のメールフォームを設置したいがデータが保持できない

chibimame

総合スコア28

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2023/01/17 16:15

編集2023/01/19 05:16

前提

WordPressでサイトを作成中です。
プラグインを使わず、自作でメールフォームを作成しようとしています。
入力画面→確認画面→サンクスページ
としたいです。
確認画面からサンクスページの遷移の段階で、$_POST['token']がNULLになって不正アクセスと認識され、困っています。

実現したいこと

- [ ] 入力画面から確認画面への遷移段階で、データを保持したい
- [ ] 確認画面から戻るボタンを押した時に、データを保持した状態でフォーム部分に戻りたい

  • 確認画面から送信ボタンを押してThanksページに飛んだ時に、お問い合わせ内容がメールで届くようにしたい

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

  • サンクスページへ遷移段階で、トークンがNULLになって不正アクセスとされています。

サンクスページにて、以下で変数を確認したところ、$_SESSIONは取れてるのですが、$_POSTがNULLでした。
var_dump($_SESSION['key']);
var_dump($_POST['token']);

該当のソースコード

### confirm.php

PHP

1<?php 2session_start(); 3//クリックジャッキングへの対策 4header('X-Frame-Options: DENY'); 5//フォームを経ずにこのページに直接アクセスした場合は拒否する 6if(!isset($_POST['token'])) { 7 echo '不正なアクセスの可能性があります'; 8 exit; 9} 10 11//フォームに入力された値のエスケープ処理 12function e($str) { 13 return htmlspecialchars($str, ENT_QUOTES|ENT_HTML5, 'UTF-8'); 14} 15 16//入力内容を$_SESSIONに格納する 17$_SESSION['contact-name'] = e($_POST['contact-name']); 18$_SESSION['contact-mail'] = e($_POST['contact-mail']); 19$_SESSION['contact-tel'] = e($_POST['contact-tel']); 20$_SESSION['contact-affiliation'] = e($_POST['contact-affiliation']); 21$_SESSION['contact-about'] = e($_POST['contact-about']); 22$_SESSION['contact-detail'] = e($_POST['contact-detail']); 23?> 24 25<table> 26 〜〜〜〜〜〜〜〜中略〜〜〜〜〜〜〜〜 27 </table> 28 29<form action="thanks" method="post"> 30 <div class="confirm-btn"> 31  <!-- 入力フォームから送られてきたトークンを次のページに引き継ぐ --> 32  <input type="hidden" name="token" value="<?= $_POST['token'] ?>"> 33   <a href="#" onclick="window.history.back(); return false;"><span>戻る</span></a> 34   <button type="submit" value="送信"><span>送信</span></button> 35 </div> 36</form>

### thanks.php

PHP

1<?php 2session_start(); 3 4//クリックジャッキングへの対策 5header('X-Frame-Options: DENY'); 6 7//フォームを経ずにこのページに直接アクセスした場合は拒否する 8if(!isset($_POST['token'])) { 9 echo '不正なアクセスの可能性があります'; 10 exit; 11} 12 13//キーとトークンが一致したら管理者に入力内容がメールで送られる 14if($_SESSION['key'] === $_POST['token']) { 15 $name = $_SESSION['contact-name']; 16 $mail = $_SESSION['contact-mail']; 17 $tel = $_SESSION['contact-tel']; 18 $affiliation = $_SESSION['contact-affiliation']; 19 $contact_about = $_SESSION['contact-about']; 20 $contact_detail = $_SESSION['contact-detail']; 21 22 〜〜〜〜〜〜〜〜中略〜〜〜〜〜〜〜〜 23} 24?> 25<h2>CONTACT<span>送信完了</span></h2> 26 27 <h3>送信いたしました</h3> 28 29 <p class="thanks-txt"> 30 送信完了 31 </p> 32 33 <div class="return-btn"> 34 <a href="<?php echo esc_url( home_url( '/' ) ); ?>"><span>トップページへ戻る</span></a> 35 </div>

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

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

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

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

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

AbeTakashi

2023/01/17 16:50

ぱっと見てよく分からないのが <form action="confirm/" method="post" name="contact_form"> <form method="post" action="../thanks"> の「confirm/」「../thanks」の遷移先はどのファイルなのか? session変数にフォームのデータを格納してるのが index.phpだが、フォーム自体もindex.phpにあるので、となると確認画面→メール送信画面にどうやって遷移するつもりなのか? 3つのファイルの繋がりが第三者にはよく分からないので何とも言えないのですが、全体的にフォームのactionの向き先と、フォームのデータをsession変数に格納する手順がおかしいように見えます。ファイル構成や遷移がどうなってるか? どういうデータの流れを想定しているか? エラーが出てるならエラーの情報、でてないなら画面がどのような状態なのか?などの情報を質問文に追記してください。
chibimame

2023/01/17 17:06

>Abe Takashiさん コメントありがとうございます! わかりづらくてすみません。 「../thanks」の部分ですが、confirm.phpと同じ階層に作っています「thanks.php」です。 こちらのthanks.phpを固定ページテンプレートとして、「お問い合わせありがとうございました」の表示を置いている状態です。 index.php(トップページ:https://www.〇〇○/) confirm.php(お問い合わせ内容確認ページ:https://www.〇〇○/confirm/) thanks.php(お問い合わせありがとうページ:https://www.〇〇○/thanks/) mail.php(confirm.phpからthanks.phpに遷移する送信ボタンが押された際に、メールを飛ばすための記述が書かれてるファイル) 上記のような形になっています。
chibimame

2023/01/17 17:10

また、エラーなどは出ていない状態です。
CHERRY

2023/01/17 22:55

コードでは、index.php で $_POST を受け取っていますが、上記の構成であれば confirm.php で $_POST を受け取る必要があるのではないでしょうか。
tabuu

2023/01/17 23:18

>確認画面へ遷移段階で、データが保持できません。 ・confirm.phpへリダイレクトする直前の$_SESSION変数 ・confirm.phpのsession_start()直後の$_SESSION変数 をそれぞれ確認してみてください。
chibimame

2023/01/18 05:00

>CHERRYさん >tabuuさん ご回答ありがとうございます! こちらのサイトを参考に作成したのですが↓↓↓ https://tech.amefure.com/php-questionform.php 私の認識としては、index.phpで送信確認ボタンを押したタイミングで、フォームに入力したデータが$_POSTで格納され、confirm.phpで送信ボタンを押したタイミングで$_SESSIONにてページ遷移してもデータが保持される(mail.phpでメール送信される)という認識だったのですが、どうやらお二人のご意見を見ていると違うようですね…? index.php:送信確認ボタンを押した段階で、$_POSTにて変数にデータが格納される confirm.php:送信ボタンを押した段階で、$_SESSIONにてデータが保持される すみません、PHP初心者なもので、かなり勘違いしていそうです、チグハグなこと言ってたらすみません🙏
tabuu

2023/01/18 06:22

confirm.phpでは$_SESSIONに格納した問い合わせ内容を表示するようなコードになっていますが ページには何が表示されていますか? >confirm.phpは固定ページテンプレートです。 提示されたソースコードやファイル名だけでは判断できませんが、confirm固定ページにおいてどのようにconfirm.phpをテンプレートに設定していますか?
chibimame

2023/01/18 06:59

>tabuuさん confirm.phpでは、なぜかお名前の<td>部分に「confirm」と表示されています💦 その他の項目は何も入っておらず、htmlで記載したthの「メールアドレス」「電話番号」などが書かれているのみで、あとは戻るボタンと送信ボタンが表示されています。 >提示されたソースコードやファイル名だけでは判断できませんが、confirm固定ページにおいてどのようにconfirm.phpをテンプレートに設定していますか? confirm.phpテンプレートはindex.phpと同じ階層に作成しており、固定ページで作成した「お問い合わせ確認」の中の「ページ属性」部分のテンプレートにて選択しています。 スラッグ名は「confirm」です。
tabuu

2023/01/18 07:16

・confirm.phpへリダイレクトする直前の$_SESSION変数 ・confirm.phpのsession_start()直後の$_SESSION変数 こちらはご確認されましたでしょうか?
chibimame

2023/01/18 10:03 編集

>tabuuさん ありがとうございます! >・confirm.phpへリダイレクトする直前の$_SESSION変数 >・confirm.phpのsession_start()直後の$_SESSION変数 確認したところ、どちらの変数も取れてないようでした。 ただ、入力せずに送信ボタンを押した場合、else以下のエラー処理は通るようです。 それと、confirm.phpのsession_start()直後に、index.phpでsubmitしたタイミングで起動するよう記述している、POSTデータを変数に格納するという記述をコピペしたところ、index.phpで記入したデータがconfirm.phpで表示されました。(やはりCHERRYさんが仰ってたように、confirm.phpで$_POSTを受け取る必要がある…?) が、$_SESSION変数には格納されてないようで、戻るボタンを押すとデータが保持されてない状態でindex.phpに戻ります… index.phpで$_SESSIONに格納できれば、confirm.phpで$_POSTを受け取る必要はないという認識だったのですが、違いますでしょうか…?🤔
chibimame

2023/01/19 02:18

他のページを参考にしつつ、再度ソースを確認し、SESSIONとPOSTの関係を見直して構築しなおしたところ、index.phpからconfirmへデータを渡すところまでできるようになりました。 ですが、thanks.phpへ遷移し、メールを送る処理の段階で、トークンがNULLになっており、不正アクセスとみなされてしまいました。 こちらの原因、わかる方いらっしゃいますでしょうか… var_dump($_POST['token']);で確認したところ、NULLと表示されました。
AbeTakashi

2023/01/19 05:43

見た感じあってそうですが、<input type="hidden" name="token" value="<?= $_POST['token'] ?>">の時点で、クライアントのHTMLソース上でちゃんとvalueの中にキーの値が入っているのでしょうか? 確認画面の前(フォームの表示時?)でトークンを発行してるんですよね? トークンの引き回しが上手くいってないくらいしか原因はなさそうですよね。
chibimame

2023/01/19 06:15

>Abe Takashiさん ありがとうございます! です、index.phpで以下のようにトークン発行しています。 <?php session_start(); //クリックジャッキングへの対策 header('X-Frame-Options: DENY'); //トークンの生成 $token = sha1(uniqid(rand(), true)); //トークンを$_SESSIONに格納し、それをキーとする $_SESSION['key'] = $token; ?> また、confirm.phpの段階では$_POST['token']と$_SESSION['key']、共に格納されていました。 thanks.phpのみで、$_POST['token']がNULLになり、$_SESSION['key']はデータが入っていました。
chibimame

2023/01/19 06:52 編集

>Abe Takashiさん ><input type="hidden" name="token" value="<?= $_POST['token'] ?>">の時点で、クライアントのHTMLソース上でちゃんとvalueの中にキーの値が入っているのでしょうか? 補足ですが、上記部分、開発モードで見るとvalueに値が入ってます。 また、/thanksに飛んだ際、「不正アクセスの可能性があります」とは出るんですが、URLバーの部分で /thanks/?token=(valueの値) で表示されてます👀
AbeTakashi

2023/01/19 09:47

だとすれば理由は分かりませんがgetで渡ってるのかもしれませんね。試しに$_GET['token']をvar_dumpでみてみたらどうでしょう? それでデータがとれてるのなら、POSTにならない理由を探せばいいと思いますが、ソースコード上では不備はなさそうに見えます。
tabuu

2023/01/19 23:26

リダイレクトしているような感じもしますね。 formのactionを「thanks」ではなく「thanks/」としてご確認いただけないでしょうか。
chibimame

2023/01/23 11:19

>みなさま お世話になっております、たくさんの質問と解決策を考えてくださってありがとうございました! たくさん色々な案を出してくださって大変恐縮なのですが、やっと原因がわかりました。 <input type="hidden" name="token" value="<?= $_POST['token'] ?>"> こちらのvalueの前のスペースが全角になっていたため、POSTではなくGETでデータが送信されてるという何とも間抜けな原因でしたorz WordPressのテーマテンプレートから直接触っていたため、全く気づかずでした。 AbeTakashiさんがご教示くださってたように、POSTにならない理由を探していたところこちらに辿り着きました。 ありがとうございました。
guest

回答1

0

自己解決

php

1<input type="hidden" name="token" value="<?= $_POST['token'] ?>">

ここの部分のソースの、valueの前スペースが全角になっていたため、データがGETで送信されていたことが原因でした。
WordPressのテーマテンプレートを管理画面上から触っていたため、全角に気づくのが遅くなってしまいました。
ここの部分を半角に変えたところ、無事POST送信され、メール送信されました。

投稿2023/01/23 11:21

chibimame

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問