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

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

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

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

PHP

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

Q&A

解決済

2回答

1789閲覧

WPの問合せフォームで$_SESSIONに登録されたデータがページ遷移でNULLになる。

TakanobuOgawa

総合スコア0

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/05/04 17:24

編集2020/05/05 00:36

前提・実現したいこと

現在、WPのオリジナルテーマの一部として作成しているコンタクトフォームで手詰まりになっています。入力画面→確認画面→送信画面の流れに進んでいくのですが、確認画面で$_POSTで受け取ったデータをサニタイズ後、$_SESSIONに登録するも、送信画面に遷移した時には$_SESSIONのデータがNULLになっているという状態です。(送信されてくるお知らせメールは変数が空の状態で送られてきます。)

また、同じコードでタイトルだけを変えたものを2つ設置しており、両方ともで同様の症状が発生しています。勉強不足で申し訳ありませんが、ご教示のほどお願いいたします。

該当のソースコード

入力画面

PHP

1<?php 2/* 3Template Name: TEMPLATE-PAGE 4*/ 5 6// トークン生成 7if ( !isset($_SESSION['entry-token']) ) { 8 $_SESSION['entry-token'] = sha1(random_bytes(30)); 9} 10 11// 特殊文字のエスケープ処理 12function escape($str) { 13 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 14} 15 16?> 17 18<?php get_header() ?> 19<?php include 'snippet-header.php'; ?> 20 21<main> 22 23<section class="page-form"> 24 25 <form action="<?php echo get_permalink( get_page_by_title("entryform-confirmation")) ?>" method="post" name="entryform" > 26 27 <div class="formparts-group"> 28 <div class="formparts-label"> 29 <p>名前<span class="required-label">必須</span></p> 30 </div> 31 32 <div class="formparts-text"> 33 <input type="text" name="entry-name" size="60" placeholder="(例)超太郎" value="<?php if( isset($_SESSION['entry-name']) ) { echo escape($_SESSION['entry-name']); } else { echo ""; } ?>" id="form-name" class=""><span id="err-msg-name" class="err-msg"></span> 34 </div> 35 </div> 36 <div class="formparts-group"> 37 <div class="formparts-label"> 38 <p>TEL<span class="required-label">必須</span></p> 39 </div> 40 41 <div class="formparts-text"> 42 <input type="text" name="entry-tel" size="60" placeholder="" value="<?php if( isset($_SESSION['entry-tel']) ) { echo escape($_SESSION['entry-tel']); } else { echo ""; } ?>" id="form-tel" class=""><span id="err-msg-tel" class="err-msg"></span> 43 </div> 44 </div> 45 46 47 <div class="formparts-group"> 48 <div class="formparts-label"> 49 <p>Mail<span class="required-label">必須</span></p> 50 </div> 51 52 <div class="formparts-text"> 53 <input type="text" name="entry-mail" size="60" placeholder="" value="<?php if( isset($_SESSION['entry-mail']) ) { echo escape($_SESSION['entry-mail']); } else { echo ""; } ?>" id="form-mail" class=""><span id="err-msg-mail" class="err-msg"></span> 54 </div> 55 </div> 56 57 58 <div class="formparts-group-wide"> 59 <div class="formparts-label-lines"> 60 <p>お問い合せ内容<span class="required-label">必須</span></p> 61 </div> 62 63 <div class="formparts-textarea"> 64 <textarea name="entry-content" wrap=”soft” cols="" rows="3" placeholder="お問い合わせ内容をご記入ください。" value="<?php if( isset($_SESSION['entry-content']) ) { echo escape($_SESSION['entry-content']); } else { echo ""; } ?>" id="form-contents" class=""></textarea> 65 </div> 66 <span id="err-msg-contents" class="err-msg"></span> 67 </div> 68 69 70 <div class="formparts-sendbtn"> 71 <input type="hidden" name="entry-token" value="<?php echo escape($_SESSION['entry-token']); ?>" /> 72 <input type="submit" name="data-confirm" value="入力内容の確認" class="sendbtn" id="sendbtn" /> 73 </div> 74 </form> 75</section> 76 77</main> 78

確認ページ

PHP

1<?php 2 3/* 4 5Template Name: TEMPLATE-PAGE 6 7*/ 8 9 10function escape($str) { 11 if (is_array($str)){ 12 return array_map('escape', $str); 13 } else { 14 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 15 } 16} 17 18function spaceTriming($str) { 19 $str = preg_replace('/^[  ]+/u', '', $str); 20 $str = preg_replace('/[  ]+$/u', '', $str); 21 return $str; 22} 23 24function controlCharacterSanitizer($str) { 25 $str = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1f\x7f]/', '', $str); 26 return $str; 27} 28 29function nullByteSanitizer($str) { 30 $str = str_replace("\0", "", $str); 31 return $str; 32} 33 34function encodingCheck($str) { 35 if ( !mb_check_encoding($str, 'UTF-8') ) { 36 wp_safe_redirect( home_url() ); // 不正入力 37 exit(); 38 } 39} 40 41 42function exeSanitizer($data) { 43 if ( is_array($data) ) { 44 return array_map('exeSanitizer', $data); 45 } 46 47 encodingCheck($data); 48 $data = spaceTriming($data); 49 $data = controlCharacterSanitizer($data); 50 $data = nullByteSanitizer($data); 51 52 return $data; 53} 54 55 56function illegalAccessCheck( ) { 57 if (!isset($_SESSION['entry-token'])) { 58 wp_safe_redirect( home_url() ); // 不正入力 59 exit(); 60 } 61 62 if( !(hash_equals($_POST['entry-token'], $_SESSION['entry-token'])) && !empty($_POST['entry-token'])) { 63 wp_safe_redirect( home_url() ); // 不正入力 64 exit(); 65 } 66} 67 68 69illegalAccessCheck(); 70 71$_POST = exeSanitizer($_POST); 72$_GET = exeSanitizer($_GET); 73$_COOKIE = exeSanitizer($_COOKIE); 74 75 76 77// 変数に代入 78$dataName = $_POST["entry-name"]; 79$dataTel = $_POST["entry-tel"]; 80$dataMail = $_POST["entry-mail"]; 81$dataContent = $_POST["entry-content"]; 82 83 84// SESSIONに登録 85$_SESSION['entry-name'] = $dataName; 86$_SESSION['entry-tel'] = $dataTel; 87$_SESSION['entry-mail'] = $dataMail; 88$_SESSION['entry-content'] = $dataContent; 89 90//var_dump($_SESSION); 91 92/* 93echo "SESSION-name:".$_SESSION['entry-name']."<br>"; 94echo "SESSION-tel:".$_SESSION['entry-tel']."<br>"; 95echo "SESSION-mail:".$_SESSION['entry-mail']."<br>"; 96echo "SESSION-content:".$_SESSION['entry-content']."<br><br>"; 97 98*/ 99 100?> 101 102<?php get_header() ?> 103 104<?php include 'snippet-header.php'; ?> 105 106<main> 107 108 109 110<section class="page-form"> 111 112 <form action="<?php echo get_permalink( get_page_by_title("entryform-thanks")) ?>" method="post" name="entryform" onSubmit = "validatoin()"> 113 114 <div class="formparts-group"> 115 <div class="formparts-label"> 116 <p>名前<span class="required-label">必須</span></p> 117 </div> 118 119 <div class="formparts-text"> 120 <p class="confirm-content"><?php echo escape($dataName); ?></p> 121 </div> 122 </div> 123 124 <div class="formparts-group"> 125 <div class="formparts-label"> 126 <p>TEL<span class="required-label">必須</span></p> 127 </div> 128 129 <div class="formparts-text"> 130 <p class="confirm-content"><?php echo escape($dataTel); ?></p> 131 </div> 132 </div> 133 134 135 <div class="formparts-group"> 136 <div class="formparts-label"> 137 <p>Mail<span class="required-label">必須</span></p> 138 </div> 139 140 <div class="formparts-text"> 141 <p class="confirm-content"><?php echo escape($dataMail); ?></p> 142 </div> 143 </div> 144 145 <div class="formparts-group"> 146 <div class="formparts-label"> 147 <p>お問合せ種別<span class="required-label">必須</span></p> 148 </div> 149 150 <div class="formparts-text"> 151 <p class="confirm-content"><?php echo nl2br(escape($dataContent)); ?></p> 152 </div> 153 </div> 154 155 <div class="formparts-confirm-backbtn"> 156 157 <input name="data-back" value="戻る" class="sendbtn" onClick="history.back()" /> 158 </div> 159 160 <div class="formparts-confirm-sendbtn"> 161 <input type="hidden" name="entry-token" value="<?php echo $_SESSION['entry-token']; ?>" /> 162 163 <input type="submit" name="data-confirm" value="送信" class="sendbtn" /> 164 </div> 165 </form> 166 167</section> 168 169</main> 170 171

送信ページ

PHP

1<?php 2/* 3Template Name: TEMPLATE-PAGE 4*/ 5 6function illegalAccessCheck( ) { 7 if (!isset($_SESSION['entry-token'])) { 8 wp_safe_redirect( home_url() ); // 不正遷移 9 exit(); 10 } 11 if( !(hash_equals($_POST['entry-token'], $_SESSION['entry-token'])) && !empty($_POST['entry-token'])) { 12 wp_safe_redirect( home_url() ); // 不正遷移 13 exit(); 14 } 15} 16 17illegalAccessCheck(); 18 19// SESSIONに登録 20$dataName = $_SESSION['entry-name']; 21$dataTel = $_SESSION['entry-tel']; 22$dataMail = $_SESSION['entry-mail']; 23$dataContent = $_SESSION['entry-content']; 24 25 26$message = <<<EOM 27※エントリーフォームからのお問合せ 28 29【氏名】 30$dataName 31 32【電話番号】 33$dataTel 34 35【メールアドレス】 36$dataMail 37 38 39【問合せ内容】 40$dataContent 41 42EOM; 43 44 45$to = "example@example.com"; 46$subject = "【お知らせ】エントリーフォームからお問合せがありました。"; 47 48 49$sendingResult = ""; 50 51echo "SESSION-name:".$_SESSION['entry-name']."<br>"; 52echo "SESSION-tel:".$_SESSION['entry-tel']."<br>"; 53echo "SESSION-mail:".$_SESSION['entry-mail']."<br>"; 54echo "SESSION-content:".$_SESSION['entry-content']."<br><br>"; 55 56echo "dataname:".$dataName."<br>"; 57echo "datatel:".$dataTel."<br>"; 58echo "datamail:".$dataMail."<br>"; 59echo "datacontent:".$dataContent."<br>"; 60 61var_dump($_SESSION); 62 63if(wp_mail($to, $subject, $message)){ 64 $sendingResult = "<p>送信が完了しました。</p> 65 <p>2営業日以内に担当者より連絡いたしますので、お待ちください。</p>"; 66 67 $_SESSION = array(); 68 if (isset($_COOKIE[session_name()])) { 69 setcookie(session_name(), '', time() - 1800, '/'); 70 } 71 session_destroy(); 72 73} else { 74 $sendingResult = "送信に失敗しました。<br>もう一度最初からご入力ください。"; 75 76} 77 78?> 79 80<?php get_header() ?> 81 82<?php include 'snippet-header.php'; ?> 83 84<main> 85 86<section class="page-form"> 87 88 <div class="result"><p><?php echo $sendingResult ?></p></div> 89 90 <div class="formparts-topbtn"> 91 <button type="button" onclick="location.href='<?php echo home_url() ?>'">トップへ戻る</button> 92 </div> 93 94</section> 95 96</main> 97

以下、functions.php

php

1function init_session_start(){ 2 session_start(); 3} 4add_action('init', 'init_session_start'); 5 6 7add_action( 'send_headers', function() { 8 header( 'X-Frame-Options: SAMEORIGIN' ); 9} );

試したこと

原因が分からず試行錯誤している時、各ページで$_SESSIONが登録されているかどうかを見るために変数をvar_dump()やechoで出力していたのですが、確認ページのコメントアウトしているecho部分を表示させると$_SESSIONはNULLにならず、正常に送られてきます。

補足情報(FW/ツールのバージョンなど)

session_start()とクリックジャッキング対策はfunctions.phpに記載しています。

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

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

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

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

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

TakanobuOgawa

2020/05/05 00:08 編集

ありがとうございます。session_id()は取得できています。 確認ページにてvar_dump()やechoで$_SESSIONを出力するとデータの登録されていることが確認できています。ページ遷移すると送信ページではNULLになってしまいますが、不思議なことに確認ページにて一度echoで$_SESSIONを表示させると、ページ遷移後もNULLになりません。
guest

回答2

0

自己解決

上記問題の解決はしていませんが、時間も経過しているため、一旦解決済みとさせていただきます。

投稿2020/05/29 00:37

TakanobuOgawa

総合スコア0

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

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

0

$_SESSIONがNULLになるという状況は改善されましたので、共有しておきます。

上記のコードは最後のメール送信画面で送信に成功すると$_SESSIONを破棄する内容になっています。送信完了後に$_SESSIONを吐き出すと$_SESSION情報は破棄されていましたが、なぜかトップページ遷移後にsession_idを確認すると、破棄前の値のままで残っている状態でした。

そこで、試しにif文の中で処理していた$_SESSIONの破棄をif文を抜けた後に移すと、$_SESSIONはNULLにならず、正しい値でメール送信がされました。また、if文の中でセッションクッキーを破棄するif文を取り除くことでも、同様にメール送信ができました。

なぜそのようになったのか理由が分かりませんので、もしお分かりになる方がいらっしゃれば、ご教示いただければ幸いです。よろしくお願いいたします。

投稿2020/05/08 09:22

TakanobuOgawa

総合スコア0

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

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

TakanobuOgawa

2020/05/19 04:53

ご返答ありがとうございます。また遅くなり申し訳ございません。 こちらの説明不足で申し訳ありません。 session_destroy()にてsession_idを削除し、$_SESSION=array()で配列を空っぽに下にも関わらず、ページ遷移後は同じsession_idが残っていたため、不思議に感じていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問