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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

319閲覧

HTMLでお問合せフォームを作る際の複数選択チェックボックスの実装について

master_o

総合スコア1

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2024/11/04 08:36

実現したいこと

①チェックボックスで複数選択をした際にも、管理者宛のお問合せ内容確認メールに複数項目を反映したい。

②複数項目選択可能のチェックボックスを必須項目にしたい。

発生している問題・分からないこと

①Q1とQ2において、複数選択をした際にお問合せ内容確認メールに複数項目が反映されない(空欄になる)。その他を選択した場合のみ、項目「その他」がお問合せ内容確認メールに反映される。

②Q1とQ2を必須項目にしたいが、無選択の場合でも送信できてしまう。

該当のソースコード

HTML

1<tr> 2 <th>Q1 該当項目をお選びください。(複数チェック可)</th> 3 <td> 4 <label><input type="checkbox" name="type" value="項目1" class="js-check"  ><span>項目1</span></label> 5 <label><input type="checkbox" name="type" value="項目2" class="js-check"><span>項目2</span></label> 6 <label><input type="checkbox" name="type" value="その他" class="js-check" 7 onclick="toggleOtherInput('type', 'otherInputBox1')"><span>その他</span></label> 8 <div id="otherInputBox1" style="display: none;"> 9 <input type="text" name="otherType" placeholder="その他をチェックした方はこちらにご記入ください"> 10 </div> 11 </td> 12</tr> 13<tr> 14 <th>Q2 該当項目をお選びください。(複数チェック可)</th> 15 <td> 16 <label><input type="checkbox" name="problem" value="項目3" class="js-check"><span>項目3</span></label> 17 <label><input type="checkbox" name="problem" value="項目4" class="js-check"><span>項目4</span></label> 18 <label><input type="checkbox" name="problem" value="項目5" class="js-check"><span>項目5</span></label> 19 <label><input type="checkbox" name="problem" value="その他" class="js-check" 20 onclick="toggleOtherInput('problem', 'otherInputBox3')"><span>その他</span></label> 21 <div id="otherInputBox3" style="display: none;"> 22 <input type="text" name="otherProblem" placeholder="その他をチェックした方はこちらにご記入ください"> 23 </div> 24 </td> 25<tr> 26<tr> 27 <th class="input">Q3 該当項目をお選びください。</th> 28 <td> 29 <label><input type="radio" name="status" value="項目6" class="js-check" onclick="formSwitch('otherInputBox4')" 30 required><span>項目6</span></label> 31 <label><input type="radio" name="status" value="項目7" class="js-check" required><span>項目7</span></label> 32 <div id="otherInputBox4" style="display: none;"> 33 <input type="text" name="otherToolName" placeholder="項目6をお選びになった方はこちらに詳細をご記入ください"> 34 </div> 35 </td> 36</tr> 37 38====================================================================== 39 40 41<script> 42 document.querySelector('form').addEventListener('submit', function (event) { 43 event.preventDefault(); // フォームのデフォルト送信を防ぐ 44 const formData = new FormData(this); 45 46 fetch('send_mail.php', { 47 method: 'POST', 48 body: formData 49 }) 50 .then(response => response.text()) 51 .then(data => { 52 window.location.href = 'thank_you.html'; 53 }) 54 .catch(error => { 55 console.error('Error:', error); 56 }); 57 }); 58 59 60 function toggleOtherInput(groupName, inputBoxId) { 61 // チェックされている「その他」以外の入力欄を非表示にする 62 const checkboxes = document.querySelectorAll(`input[name="${groupName}"]`); 63 const selectedInputBox = document.getElementById(inputBoxId); 64 let showOtherInput = false; 65 66 // チェックされている項目に「その他」が含まれているか確認 67 checkboxes.forEach((checkbox) => { 68 if (checkbox.checked && checkbox.value === "その他") { 69 showOtherInput = true; 70 } else if (checkbox.checked && checkbox.value !== "その他") { 71 showOtherInput = false; 72 } 73 }); 74 75 // 「その他」がチェックされている場合のみ表示 76 selectedInputBox.style.display = showOtherInput ? "block" : "none"; 77 } 78 79 80 function formSwitch(inputBoxId) { 81 // 他の「その他」入力欄を非表示にする 82 document.querySelectorAll('[id^="otherInputBox"]').forEach(function (box) { 83 box.style.display = "none"; 84 }); 85 86 // 該当する入力欄のみ表示する 87 if (inputBoxId) { 88 var selectedInputBox = document.getElementById(inputBoxId); 89 if (selectedInputBox) { 90 selectedInputBox.style.display = "block"; 91 } 92 } 93 } 94 // ページ読み込み時に初期化 95 window.addEventListener('load', formSwitch); 96 97 98</script>

send_mail.php

1<?php 2if ($_SERVER["REQUEST_METHOD"] == "POST") { 3 $type = htmlspecialchars($_POST['type']); 4 $otherType = htmlspecialchars($_POST['otherType']); 5 $problem = htmlspecialchars($_POST['problem']); 6 $otherProblem = htmlspecialchars($_POST['otherProblem']); 7 $status = htmlspecialchars($_POST['status']); 8 $otherToolName = htmlspecialchars($_POST['otherToolName']); 9 10 $to = "メールアドレスを入れています"; 11 $subject = "株式会社〇〇|お問合せがありました"; 12 $body = "下記内容でお問合せがありました\n\n"; 13 $body .= "Q1 質問1: $type\n"; 14 $body .= "[【Q1でその他】を選択した方のみ]その他の内容: $otherType\n"; 15 $body .= "Q2 質問2: $problem\n"; 16 $body .= "[【Q2でその他】を選択した方のみ]その他の内容: $otherProblem\n"; 17 $body .= "Q3 質問3: $status\n"; 18 $body .= "[【Q3で項目1】を選択した方のみ]項目1の詳細: $otherToolName\n"; 19 20 21 $headers = "From: no-reply@aaa.co.jp"; 22 23 if (mail($to, $subject, $body, $headers)) { 24 echo "success"; 25 } else { 26 echo "failure"; 27 } 28} else { 29 echo "不正なリクエストです。"; 30} 31 32if ($_SERVER['REQUEST_METHOD'] === 'POST') { 33 $recaptchaSecret = ''; 34 $recaptchaResponse = $_POST['g-recaptcha-response']; 35 36 // reCAPTCHAの検証リクエストを送信 37 $url = 'https://www.google.com/recaptcha/api/siteverify'; 38 $data = [ 39 'secret' => $シークレットキー, 40 'response' => $recaptchaResponse 41 ]; 42 43 $options = [ 44 'http' => [ 45 'method' => 'POST', 46 'header' => 'Content-type: application/x-www-form-urlencoded', 47 'content' => http_build_query($data) 48 ] 49 ]; 50 51 $context = stream_context_create($options); 52 $result = file_get_contents($url, false, $context); 53 $resultJson = json_decode($result); 54 55 // reCAPTCHAの検証結果を確認 56 if ($resultJson->success != true) { 57 echo 'reCAPTCHA verification failed. Please try again.'; 58 } else { 59 // ここにフォーム処理のコードを追加 60 echo 'reCAPTCHA verification succeeded.'; 61 } 62} 63

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

いろいろ調べましたが、わかりませんでした。

補足

恥ずかしながらjavasscriptとPHPの初学者でして、どこのコードに問題があるのかわかりかねるため修正箇所を教えていただけないでしょうか。
該当と思われる箇所のコードを添付いたします。
記載内容以外で必要な内容があればご質問頂けますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

フォームのチェックボックスから選択された項目をPOSTリクエストでサーバーに送信し、サーバーサイドでその値を取得して管理者にメールを送信することですか

投稿2024/11/05 11:47

isai

総合スコア148

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

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

master_o

2024/11/11 01:46

いただいた通りになります!
guest

0

参考までに
「data-required」属性を設定した要素は何もチェックがないときにrequiredされる・・・みたいな仕組みが楽かもしれません。配列をPHPに送るときはnameの付け方を工夫してください。(今回はその他の項目を受け渡す処理は割愛)
またPHP側もfilter_inputで受けると処理は楽になります

PHP

1<?PHP 2$type =filter_input(INPUT_POST,"type" ,FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3$problem=filter_input(INPUT_POST,"problem",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 4$status =filter_input(INPUT_POST,"status" ,FILTER_DEFAULT); 5$submit =filter_input(INPUT_POST,"submit" ,FILTER_DEFAULT); 6if($submit){ 7 $body = "下記内容でお問合せがありました".PHP_EOL.PHP_EOL; 8 $body .= "Q1 質問1: ".implode(",",$type).PHP_EOL; 9 $body .= "Q2 質問2: ".implode(",",$problem).PHP_EOL; 10 $body .= "Q3 質問3: ".$status.PHP_EOL; 11 print "<pre>".PHP_EOL; 12 var_dump($body); 13 print "</pre>".PHP_EOL; 14} 15?> 16<script> 17 18const setRequired=()=>{ 19 [...document.querySelectorAll('[name][data-required]')].forEach(x=>{ 20 x.toggleAttribute('required',!document.querySelector(`[name="${x.name}"][data-required]:checked`)); 21 }); 22}; 23window.addEventListener('DOMContentLoaded', ()=>{ 24 setRequired(); 25 document.addEventListener('change', ()=>{ 26 setRequired(); 27 }); 28}); 29</script> 30<form method="post"> 31<fieldset> 32<legend>Q1 該当項目をお選びください。(複数チェック可)</legend> 33<p> 34<label><input type="checkbox" name="type[]" value="項目1" data-required><span>項目1</span></label> 35<label><input type="checkbox" name="type[]" value="項目2" data-required><span>項目2</span></label> 36<label><input type="checkbox" name="type[]" value="その他" data-required><span>その他</span></label> 37</p> 38</fieldset> 39<fieldset> 40<legend>Q2 該当項目をお選びください。(複数チェック可)</legend> 41<p> 42<label><input type="checkbox" name="problem[]" value="項目3" data-required><span>項目3</span></label> 43<label><input type="checkbox" name="problem[]" value="項目4" data-required><span>項目4</span></label> 44<label><input type="checkbox" name="problem[]" value="項目5" data-required><span>項目5</span></label> 45<label><input type="checkbox" name="problem[]" value="その他" data-required><span>その他</span></label> 46</p> 47</fieldset> 48<fieldset> 49<legend>Q3 該当項目をお選びください。</legend> 50<p> 51<label><input type="radio" name="status" value="項目6" required><span>項目6</span></label> 52<label><input type="radio" name="status" value="項目7" required><span>項目7</span></label> 53</p> 54</fieldset> 55<input type="submit" name="submit" value="send"> 56</form>

投稿2024/11/05 03:39

編集2024/11/05 03:40
yambejp

総合スコア116443

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

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

master_o

2024/11/11 01:45

丁寧にご連絡いただきありがとうございます。参考にさせていただきます。
guest

0

自己解決

フリーのフォームフレームワークをカスタマイズして書き直すことで解決しました!

投稿2024/11/04 13:22

master_o

総合スコア1

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

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

juner

2024/11/05 04:09

具体的には何をどうカスタマイズしたのかとても気になります。
master_o

2024/11/11 01:46

PHP工房の無料配布コードをカスタマイズしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問