<< レンタルサーバー上のPHPプログラ... 質問一覧 週間カレンダーについて >>

  • 0P
フォーム内のチェックボックスの値を取得

いつもお世話になっております。そしていつも助けていただきありがとうございます。
今回は、チェックボックスの値の取り方で悩んでいます。
下記サンプルを使って、テキストボックスやラジオボタン以外にチェックボックス(複数選択可)も
使うことになりました。HTML側でname="abc[]"をセットしてvalue(値)を取得するのは
わかったのですが、下記プログラムにどう組み込んで良いのかがわかりません。
print_r($_POST)を使用して、値が入ってくるのは確認したのですが…。
毎度、申し訳ありませんがどなたかご指導頂けますでしょうか。

  1. チェックボックス側の処理
  2. <input type="checkbox" name="abc[]" id="abc" value="abc1">abc1
  3. <input type="checkbox" name="abc[]" id="abc" value="abc2">abc2
  4. <input type="checkbox" name="abc[]" id="abc" value="abc3>abc3
  5.  
  6. ーーーーー
  7. <?php
  8.  
  9. $script ="sendmail.php";
  10.  
  11. $to = "example@example.com";
  12.  
  13. $sbj = "お問い合わせ";
  14.  
  15. // 送信確認画面の表示(する=1, しない=0)
  16. $chmail = 1;
  17.  
  18. // 送信後のページジャンプ(する=1, しない=0)
  19. $jpage = 0;
  20.  
  21. // 送信後にジャンプするページ
  22. $next = "http://example.com/";
  23.  
  24. // 差出人は、送信者のメールアドレスにする(する=1, しない=0)
  25. // する場合は、メール入力欄のname属性を「email」
  26. $from_add = 1;
  27.  
  28. // 差出人に送信内容確認メールを送る(送る=1, 送らない=0)
  29. // 送る場合は、メール入力欄のname属性を「email」にしてください。
  30. $remail = 1;
  31.  
  32. // 差出人に送信確認メールを送る場合のメールのタイトル
  33. $resbj = "件名";
  34.  
  35. // 必須入力項目を設定する(する=1, しない=0)
  36. $esse = 1;
  37.  
  38. // 必須入力項目(入力フォームで指定したname)
  39. $eles = array('email');
  40.  
  41. ーーーーー
  42.  
  43. $sendm = 0;
  44. foreach($_POST as $key=>$var) {
  45.   if($var == "eweb_submit") $sendm = 1;
  46. }
  47.  
  48. // 文字の置き換え
  49. $string_from = "";
  50. $string_to = "";
  51.  
  52. // 未入力項目のチェック
  53. if($esse == 1) {
  54.   $flag = 0;
  55.   $length = count($eles) - 1;
  56.   foreach($_POST as $key=>$var) {
  57.     $key = strtr($key$string_from$string_to);
  58.     if($var == "eweb_submit") ;
  59.     else {
  60.       for($i=0$i<=$length$i++) {
  61.         if($key == $eles[$i] && empty($var)) {
  62.           $errm .= "<P>「".$key."」は必須入力項目です。</P>\n";
  63.           $flag = 1;
  64.         }
  65.       }
  66.     }
  67.   }
  68.   foreach($_POST as $key=>$var) {
  69.     $key = strtr($key$string_from$string_to);
  70.     for($i=0$i<=$length$i++) {
  71.       if($key == $eles[$i]) {
  72.         $eles[$i] = "eweb_ok";
  73.       }
  74.     }
  75.   }
  76.   for($i=0$i<=$length$i++) {
  77.     if($eles[$i] != "eweb_ok") {
  78.       $errm .= "<P>「".$eles[$i]."」が未選択です。</P>\n";
  79.       $eles[$i] = "eweb_ok";
  80.       $flag = 1;
  81.     }
  82.   }
  83.   if($flag == 1){
  84.     htmlHeader();
  85. ?>
  86.  
  87.  
  88. <p>入力エラー</p>
  89. <?php echo $errm?>
  90. <INPUT type="button" value="前画面に戻る" onClick="history.back()">
  91.  
  92. <!--- 終了 --->
  93.  
  94.  
  95. <?php 
  96.     htmlFooter();
  97.     exit(0);
  98.   }
  99. }
  100. //--- メールのレイアウトの編集 --- 開始 ------------------->
  101.  
  102. $body="".$sbj."」からの発信です\n\n";
  103. $body.="-------------------------------------------------\n\n";
  104. foreach($_POST as $key=>$var) {
  105.   $key = strtr($key$string_from$string_to);
  106.   if(get_magic_quotes_gpc()) $var = stripslashes($var);
  107.   if($var == "eweb_submit") ;
  108.   else $body.="[".$key."".$var."\n";
  109. }
  110. $body.="\n-------------------------------------------------\n\n";
  111. $body.="送信日時:".date( "Y/m/d (D) H:i:s"time() )."\n";
  112. $body.="ホスト名:".getHostByAddr(getenv('REMOTE_ADDR'))."\n\n";
  113.  
  114. //--- 終了 --->
  115.  
  116.  
  117. if($remail == 1) {
  118. //--- 差出人への送信確認メールのレイアウトの編集 --- 開始 ->
  119.  
  120. $rebody="ありがとうございました。\n";
  121. $rebody.="以下の内容が送信されました。\n\n";
  122. $rebody.="-------------------------------------------------\n\n";
  123. foreach($_POST as $key=>$var) {
  124.   $key = strtr($key$string_from$string_to);
  125.   if(get_magic_quotes_gpc()) $var = stripslashes($var);
  126.   if($var == "eweb_submit") ;
  127.   else $rebody.="[".$key."".$var."\n";
  128. }
  129. $rebody.="\n-------------------------------------------------\n\n";
  130. $rebody.="送信日時:".date( "Y/m/d (D) H:i:s"time() )."\n";
  131. $reto = $_POST['email'];
  132. $rebody=mb_convert_encoding($rebody,"JIS","utf-8");
  133. $resbj="=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($resbj,"JIS","utf-8"))."?=";
  134. $reheader="From: $to\nReply-To: ".$to."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();
  135.  
  136. //--- 終了 --->
  137. }
  138.  
  139. $body=mb_convert_encoding($body,"JIS","utf-8");
  140. $sbj="=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($sbj,"JIS","utf-8"))."?=";
  141. if($from_add == 1) {
  142.   $from = $_POST['email'];
  143.   $header="From: $from\nReply-To: ".$_POST['email']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();
  144. } else {
  145.   $header="Reply-To: ".$_POST['email']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();
  146. }
  147. if($chmail == 0 || $sendm == 1) {
  148.   mail($to,$sbj,$body,$header);
  149.   if($remail == 1) { mail($reto,$resbj,$rebody,$reheader)}
  150. }
  151. else { htmlHeader();
  152. ?>
  153.  
  154. <!--- 送信確認画面のレイアウトの編集 --- 開始 ------------->
  155.  
  156. <p>以下の内容で間違いがなければ、「送信する」ボタンを押してください。</p>
  157. <FORM action="<? echo $script?>" method="POST">
  158. <? echo $err_message?>
  159. <TABLE border=1>
  160. <?php
  161. foreach($_POST as $key=>$var) {
  162.   $key = strtr($key$string_from$string_to);
  163.   if(get_magic_quotes_gpc()) $var = stripslashes($var);
  164.   $var = htmlspecialchars($var);
  165.   print("<TR><TH>".$key."</TH><TD>".$var);
  166. ?>
  167. <INPUT type="hidden" name="<?= $key ?>" value="<?= $var ?>">
  168. <?php
  169.   print("</TD></TR>\n");
  170. }
  171. ?>
  172. </TABLE>
  173. <INPUT type="hidden" name="eweb_set" value="eweb_submit">
  174. <INPUT type="submit" value="送信する">
  175. <INPUT type="button" value="前画面に戻る" onClick="history.back()">
  176.  
  177. </FORM>

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

Qフォーム内のチェックボックスの値を取得 surerura  [03月09日 17時40分] 
┗Re:フォーム内のチェックボックスの値を取得 shimix  [03月09日 18時00分] 
  ┗Re:Re:フォーム内のチェックボックスの値を取得 surerura  [03月10日 21時07分] 
    ┗Re:Re:Re:フォーム内のチェックボックスの値を取得 shimix  [03月10日 23時34分] 
      ┗Re:Re:Re:Re:フォーム内のチェックボックスの値を取得 surerura  [03月14日 20時40分] 
        ┗Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得 shimix  [03月14日 23時58分] 
          ┗Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得 surerura  [03月15日 19時36分] 
            ┗Re:Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得 shimix  [03月15日 22時05分] 
              ┗Re:Re:Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得 surerura  [03月17日 17時41分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:フォーム内のチェックボックスの値を取得

#チェックボックスの部分しか読んでいませんが(汗

abc[]の値だけ取り出すなら
  1. foreach($_POST['abc'] as $val) { $abc[] = $val; }
  2. print_r($abc);
でいいと思いますが・・



>どう組み込んで良いのかがわかりません。

どう組み込みたいのでしょうか?

  1. $rebody .= 'チェックされた項目' . "\r\n";
  2. foreach ($_POST['abc'] as $val) { $rebody .= '   ' . $val . "\r\n"; }

などとしてメール本文に記載したいのでしょうか?



本題とは無関係ですが、なぜmb_send_mailを使わずにmailなんでしょうか?mb_send_mailならmb_language(とmb_internal_encoding)さえ書いておけば、subjectやbodyは『そのまま』渡せるのですが・・。

Re:Re:フォーム内のチェックボックスの値を取得

shimixさん、先日はありがとうございました。
また、お世話になります。

>どう組み込みたいのでしょうか?
入力→確認画面→メール送信(自分と相手側の2通)という流れなので
確認画面とメール送信時に選択したチェックボックスの内容を他のデータ同様
表示させたいです。

  1. <input type="checkbox" name="abc[]" id="abc" value="abc1">abc1 
  2. foreach($_POST['abc'] as $val) { $abc[] = $val; }
name="abc[]"として例を書かせて頂いたのですが、他の入力項目のnameの中には
日本語のものもあります。チェックボックスの配列を取得するabcの部分も、日本語を使うことは
できるものなのでしょうか?name="選択[]"など。(だめですよね?)
プログラム上、英数字にしておいてどこかで変換しなければならないのでしょうか。

>本題とは無関係ですが、なぜmb_send_mailを使わずにmailなんでしょうか?mb_send_mailなら>mb_language(とmb_internal_encoding)さえ書いておけば、subjectやbodyは『そのまま』渡せるのですが・・。 
そうなんですね・・・。サンプルを作られた方の意図はわかりませんが・・・。
関係ないとは思いますが、文字コードが初めは、utf-8→Shift_JISだったりしたようです。

Re:Re:Re:フォーム内のチェックボックスの値を取得

>チェックボックスの配列を取得するabcの部分も、日本語を使うことは
>できるものなのでしょうか?

やってみればわかることだと思います。ちゃんと動きます。nameに日本語を使うことについては(w3cによるとnameの値はCDATAですから)問題ありません。あらゆるブラウザでの実装に問題がないかどうかは確認していませんが(汗

  1. $input = $_POST['入力'];
  2. foreach($_POST['選択'] as $val) { $sentaku[] = $val; }

(蛇足)
ただし、nameに日本語を使うことについては「validではあるけれど、不具合の元なので避けるべき」だと思います。magic_quotes_gpcがonの環境でsjisを扱うケースがないとも限りません。(value:値の方は仕方ないにしても)連想配列の添え字の文字列をstrip_slashesするのはちょっと無駄な労力じゃないですかねぇ・・)。

Re:Re:Re:Re:フォーム内のチェックボックスの値を取得

shimixさん、返信ありがとうございます。
  1. foreach($_POST['abc'] as $val) { $abc[] = $val; } 
  2. print_r($abc);

こちらのコードを試したところ、arrayという表示になってしまいました。
文字列として取り出さなくてはいけないとわかり、implodeを使うことまでは
わかったのですが、下記のような一文をどのあたりで使えばよいのかで悩んでいます。
  1. <input type="checkbox" name="abc[]" value="abc">abc
  2. $_POST['abc'] = implode(" ",$_POST['abc']);

チェックボックスを使う箇所が1箇所ではないので、チェックボックスの時はimplode
文字列取り出しをするという全体にかかる記述の仕方がわかれば解決するのでは・・・と
勝手に解釈したのですが、どうもうまく行きません。
確認画面の表示にはチェックボックスの内容が表示されるが、メールには空欄になって
しまったりしています。

Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得

>foreach($_POST['abc'] as $val) { $abc[] = $val; } 
>print_r($abc);
>
>こちらのコードを試したところ、arrayという表示になってしまいました。

いや、そうですよ。配列に格納してprint_rで出力して確認すれば?と思ったのですが、あとからわざわざ取り出すくらいなら最初から

  1. $abc = '';
  2. foreach($_POST['abc'] as $val) { $abc .= $val . "\r\n"; }
などとすればいいのでは?最初のレスでも、そういう例を示したのですが・・。

  <input type="checkbox" name="abc[]" value="abc">abc

と書いていれば、$_POST['abc']自体が配列ですよ($_POST['abc'][0], $_POST['abc'][1]・・)。

Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得

shimixさん、何度もすみません…。
下記のように入力されたすべてのデータをいっきに取得し、表示しています。
  1. foreach($_POST as $key=>$var) {  
  2. $key = strtr($key, $string_from, $string_to);
  3. if(get_magic_quotes_gpc()) $var = stripslashes($var);
  4. $var = htmlspecialchars($var);
  5. print("<TR><TH>".$key."</TH><TD>".$var);

>あとからわざわざ取り出すくらいなら最初から
この"最初から"という意味がちょっと理解できないのですが…。
教えて頂いた下記コードをどこか一カ所に組み込むことで$_POST['abc']の値が
(表示したい)すべての部分で取り出された状態になるという意味なのでしょうか?
>>CODE
$abc = '';
foreach($_POST['abc'] as $val) { $abc .= $val . "\r\n"
<<CODE; }

Re:Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得

>下記のように入力されたすべてのデータをいっきに取得し、表示しています。

「配列」で取得する項目がある場合には「配列かどうか」をチェックしないといけません。stripslasheshtmlspecialcharsの引数は(mixedではなく)stringなので配列を渡すことは出来ません。

配列を渡したら多分(@推測モード)「Array」という文字列しか返ってこない気がするのですが、例示されたソースで(配列があるケースでも)ちゃんと動かせてますか?

  1. foreach($_POST as $key=>$var) {  
  2.     $key = strtr($key, $string_from, $string_to);
  3.     $out = '';
  4.     if (is_array($var)) {
  5.         foreach ($var as $item) { $out .= $item . ','; }
  6.         if (substr($out,strlen($out) - 1,1) == ',') { $out = substr($out, 0 ,strlen($out) - 1); }
  7.     }
  8.     else {
  9.         $out = $var;
  10.     }
  11.     if(get_magic_quotes_gpc()) { $out = stripslashes($out); }
  12.     print '<TR><TH>' . $key . '</TH><TD>' . htmlspecialchars($out) . '</TD></TR>';
  13. }

配列の要素はカンマ区切りで繋いでみました。このあたりは前述のように改行で繋いで(htmlspecialcharsのあとで)nl2brにしてもいいかもしれません。

Re:Re:Re:Re:Re:Re:Re:Re:フォーム内のチェックボックスの値を取得

shimixさん、返答が遅くなり申し訳ありません。

>配列を渡したら多分(@推測モード)「Array」という文字列しか返ってこない気がするのですが、
>例示されたソースで(配列があるケースでも)ちゃんと動かせてますか?

今までチェックボックスがなかったので、特に問題は起きていませんでした。
今回、新たにチェックボックスの項目を作ってほしいということで、今回のような
問題が起きてしまい、悩んでいました。

-----
教えて頂いたコードを値を渡している部分(下記3箇所)に組み込んだところ
チェックボックスの値も取り出すことができました。
・ブラウザの確認画面
・差出人+自分宛のメール

コード内で行っている処理で次の部分がいまいちわからないので、質問させて頂きたいのですが・・・。
  1. if (is_array($var)) { // 1
  2.         foreach ($var as $item) { $out .= $item . ','; } // 2
  3.         if (substr($out,strlen($out) - 1,1) == ',') { $out = substr($out, 0 ,strlen($out) - 1); }
1.もし、入力されている値($var)に配列(この場合チェックボックス)があったら・・・
2.$var→$itemに値を移す。さらに$itemをカンマで区切って$outに入れる。
 (値がなくなるまでループ)
3.2.のループ内でカンマをつける位置を指定しているのでしょうか?

初歩的な質問で申し訳ありませんが、返答頂けますでしょうか?
よろしくお願いいたします。
レンタルサーバー上のPHPプログラ... 質問一覧 週間カレンダーについて