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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

1回答

2310閲覧

PHPで別ページのURLのファイル名を取得できない

bechamel

総合スコア4

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

2クリップ

投稿2020/08/13 02:20

編集2020/08/13 05:07

前提・実現したいこと

PHP工房のメールフォームを使い、各雇用形態(正社員、パート、派遣)のフォームページを3つ作り、
完了メールのタイトルに回答したフォームの雇用形態名を取得し出力しようとしているのですが、うまくいきません。
ご教示いただけると幸いです。
よろしくお願いいたします。

該当のソースコード

fullTime.php, part.php, temp.php

php

1// 各雇用形態(正社員、パート、派遣)フォームページ 2<?php 3session_start (); 4$url = $_SERVER['REQUEST_URI']; 5$tmp = explode("/", $url); 6$term_slug = end($tmp); 7$_SESSION["job_type"] = $term_slug; 8?>

mail.php

php

1session_start(); 2 3// フォームページで取得した値を条件分岐 4if($_SESSION['job_type'] === "fullTime.php") { 5 $chk_hopetype = "正社員"; 6} elseif ($_SESSION['job_type'] === "part.php") { 7 $chk_hopetype = "パート"; 8} elseif ($_SESSION['job_type'] === "temp.php") { 9 $chk_hopetype = "派遣"; 10} else { 11 $chk_hopetype = "取得できていない"; 12} 13$test = $_SESSION['job_type']; 14var_dump($test);

試したこと

各雇用形態のフォームページでは、URLのファイル名を取得しセッションに格納しました。
格納した値を、mail.phpで条件分岐し出力分けをしたのですがNullで返ってきてしまい、かつ「ページ遷移が不正です」と画面上に表示されてしまいます。
下記はmail.php内の「ページ遷移が不正です」を表示させている実装部分です。

php

1if(($confirmDsp == 0 || $sendmail == 1) && $empty_flag != 1){ 2 3 //トークンチェック(CSRF対策)※確認画面がONの場合のみ実施 4 if($useToken == 1 && $confirmDsp == 0){ 5 if(empty($_SESSION['mailform_token']) || ($_SESSION['mailform_token'] !== $_POST['mailform_token'])){ 6 exit('ページ遷移が不正です'); 7 } 8 if(isset($_SESSION['mailform_token'])) unset($_SESSION['mailform_token']);//トークン破棄 9 if(isset($_POST['mailform_token'])) unset($_POST['mailform_token']);//トークン破棄 10 } 11 12 //差出人に届くメールをセット 13 if($remail == 1) { 14 $userBody = mailToUser($_POST,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode); 15 $reheader = userHeader($refrom_name,$from,$encode); 16 $re_subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($re_subject,"JIS",$encode))."?="; 17 } 18 //管理者宛に届くメールをセット 19 $adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp); 20 $header = adminHeader($userMail,$post_mail,$BccMail,$to); 21 $subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS",$encode))."?="; 22 23 //-fオプションによるエンベロープFrom(Return-Path)の設定(safe_modeがOFFの場合かつ上記設定がONの場合のみ実施) 24 if($use_envelope == 0){ 25 mail($to,$subject,$adminBody,$header); 26 if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader); 27 }else{ 28 mail($to,$subject,$adminBody,$header,'-f'.$from); 29 if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader,'-f'.$from); 30 } 31}

また、「ページ遷移が不正です」が表示される原因となる、mailform_tokenについて記載がある箇所が下記になります。

各雇用形態のフォームページにCSRF対策として、下記のコードを記載しております。

php

1<?php 2//CSRF対策用 3session_name('PHPMAILFORMSYSTEM'); 4session_start(); 5$token = sha1(uniqid(mt_rand(), true)); 6$_SESSION['mailform_token'] = $token; 7$html = '<input type="hidden" name="mailform_token" value="'.$token.'" />'; 8?>

mail.phpの方にトークンをセットするために下記のコードを記載しております。

php

1//確認画面の入力内容出力用関数 2function confirmOutput($arr){ 3global $hankaku,$hankaku_array,$useToken,$confirmDsp,$replaceStr; 4$html = ''; 5foreach($arr as $key => $val) { 6$out = ''; 7if(is_array($val)){ 8foreach($val as $key02 => $item){ 9//連結項目の処理 10if(is_array($item)){ 11$out .= connect2val($item); 12}else{ 13$out .= $item . ', '; 14} 15} 16$out = rtrim($out,', '); 17 18}else{ $out = $val; }//チェックボックス(配列)追記ここまで 19if(get_magic_quotes_gpc()) { $out = stripslashes($out); } 20$out = nl2br(h($out));//※追記 改行コードを<br>タグに変換 21$key = h($key); 22$out = str_replace($replaceStr['before'], $replaceStr['after'], $out);//機種依存文字の置換処理 23 24//全角→半角変換 25if($hankaku == 1){ 26$out = zenkaku2hankaku($key,$out,$hankaku_array); 27} 28if($key != 'type'){ 29$html .= "<tr><th>".$key."</th><td>".$out; 30$html .= '<input type="hidden" name="'.$key.'" value="'.str_replace(array("<br />","<br>"),"",$out).'" />'; 31$html .= "</td></tr>\n"; 32} 33} 34//トークンをセット 35if($useToken == 1 && $confirmDsp == 1){ 36$token = sha1(uniqid(mt_rand(), true)); 37$_SESSION['mailform_token'] = $token; 38$html .= '<input type="hidden" name="mailform_token" value="'.$token.'" />'; 39} 40 41return $html; 42}

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

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

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

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

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

coco_bauer

2020/08/13 02:58

”ページ遷移が不正です”と表示されるのは、「empty($_SESSION['mailform_token']) || ($_SESSION['mailform_token'] !== $_POST['mailform_token'])」というIf文の条件が成立した場合なのですから、$_SESSION['mailform_token']と、$_POST['mailform_token']の値を確認してみてはいかがでしょうか。 これらの値を設定している部分のプログラムが質問には見当たらないので、必要であれば追加してください。
bechamel

2020/08/13 05:09 編集

coco_bauerさん ご回答していただきありがとうございます。 本文に「mailform_token」の値を使っている記載部分を追記いたしました。
guest

回答1

0

自己解決

対応策

セッションを取得できなかった原因として、session_nameの設定をしていなかったことが原因でした。
今回、3ページのヘッダー部分は共通だったのでheader.phpにまとめました。
その際に、CSRF対策でPHPの処理は記載していたので、session_startとsession_nameはひとつにまとめました。

PHP

1<?php 2 //CSRF対策用 3 session_name('PHPMAILFORMSYSTEM'); 4 session_start(); 5 $token = sha1(uniqid(mt_rand(), true)); 6 $_SESSION['mailform_token'] = $token; 7 $html = '<input type="hidden" name="mailform_token" value="'.$token.'" />'; 8 9 // URLのファイル名取得 10 $url = $_SERVER["REQUEST_URI"]; 11 $tmp = explode("/", $url); 12 $term_slug = end($tmp); 13 $_SESSION["job_type"] = $term_slug; 14?>

投稿2020/08/25 00:46

bechamel

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問