• 締切済み

PHP 送信されたフォームについて

HTMLから送信されたフォームがうまくうけとれないので質問させていただきます。 HTML側でチェックボックスを用いてphp側に送ったところうまく結果が反映されません。 HTML側で以下のソースを書き <input type="checkbox" name="kaitouran321" value="a">a <input type="checkbox" name="kaitouran322" value="b">b <input type="checkbox" name="kaitouran323" value="c">c php側で <?php print(htmlspecialchars($_POST['kaitouran321'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran322'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran323'], ENT_QUOTES, 'UTF-8')); ?> および <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> $i++; と書きました。htmlキャラはしっかり受け取ってくれるのですが、if文で書いた方は反応してくれません(iが+1されない)。選択肢がひとつの時、if文は反応するので条件の書き方がおかしいのでしょうか? 回答お願いします。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.4

> そのため、 > if($_POST['kaitouran311'] == 'c') > で条件を満たした場合はカウントアップが一回され ここ絶対カウントアップされないよね。kaitouran311はvalueがaなんだから、例えチェックが入っていてもcにはならない。 > if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran333'] == 'c') > $i++; > の部分では、条件を満たしてもカウントアップはスルーされてしまうのです。 ANo.2の補足にはこう書いてるけど、ANo.3のお礼のPHPには <?php if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran332'] == 'c') $i++; ?> って書かれてるね。で、これもkaitouran332はvalueがbなのでチェック入れてもカウントアップされん。 当方は ・Windows 7 (x64)、Apache HTTP Server 2.2.25 nossl、PHP 5.3.27。 ・CentOS 6.5 (x64)、Apache HTTP Server 2.2.15 mod_ssl、PHP 5.3.3。 の2つの環境を用意してANo.3の補足とお礼に書かれてる奴を試した。 ひょっとしたら思ったよりも単純なミスかも知れないので、深呼吸をして熱いコーヒー一杯飲んでからもう一度デスクに向かったらいいんじゃないか。 ところで余談だが、チェックボックスが4つある問3-3で、PHP側を <?php if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran333'] == 'c') $i++; ?> こう直したとして、これだと全部チェックを入れても正解にならないか? <?php if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran332'] != 'b' && $_POST['kaitouran333'] == 'c' && $_POST['kaitouran334'] != 'd') $i++; ?> という風に、「bとdにチェックが入っていないこと」も確認しないといけないかも知れないかも?

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

もらったソースはこのままでは動かないよね。どこかにJavaScriptでsendという関数があるのではないかな。 <input type="button" value="送信" onclick="send()"> を <input type="submit" value="送信"> に変えて、form閉じタグと順番を入れ替えて実行したら普通に(aとbとcの同時チェック時$i++が)動いたんだけど・・・・。 JavaScriptのsend関数が何か悪さをしている・・・・とか?

mauluru
質問者

お礼

そしてこちらが phpのソースです。 <html> <head> <title>解答</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type=""text/css""> #container{ width:1000 } #main{ width:500px; float:right; } #sidebar{ width:500px; float:left; } </style> </head> <body> <div id="container"> <div id="main"> <p>問題の解答</p> <p>問1</p> <p>(1)(2)(3)(4)(5)(6)(7)(8)</p> <p>問2</p> <p>(1)(2)(3)</p> <p>問2</p> <p>(1)(2)(3)</p> </div> <div id="sidebar"> <p><>あなたの解答<></p> <p>問1</p> <p> (1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> (5)<?php print(htmlspecialchars($_POST['kaitouran15'], ENT_QUOTES, 'UTF-8')); ?> (6)<?php print(htmlspecialchars($_POST['kaitouran16'], ENT_QUOTES, 'UTF-8')); ?> (7)<?php print(htmlspecialchars($_POST['kaitouran17'], ENT_QUOTES, 'UTF-8')); ?> (8)<?php print(htmlspecialchars($_POST['kaitouran18'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p> (1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>問3-1 (1) <?php print(htmlspecialchars($_POST['kaitouran311'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran312'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran313'], ENT_QUOTES, 'UTF-8')); ?> (2) <?php print(htmlspecialchars($_POST['kaitouran321'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran322'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran323'], ENT_QUOTES, 'UTF-8')); ?> (3) <?php print(htmlspecialchars($_POST['kaitouran331'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran332'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran333'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran334'], ENT_QUOTES, 'UTF-8')); ?> </p> </div> </div> <?php $i = 0; ?> <?php if($_POST['kaitouran11'] == '市場') $i++; ?> <?php if($_POST['kaitouran12'] == 'ニーズ') $i++; ?> <?php if($_POST['kaitouran13'] == '年齢') $i++; ?> <?php if($_POST['kaitouran14'] == 'サービス') $i++; ?> <?php if($_POST['kaitouran15'] == 'セグメンテーション') $i++; ?> <?php if($_POST['kaitouran16'] == 'ターゲッティング') $i++; ?> <?php if($_POST['kaitouran17'] == 'ポジショニング') $i++; ?> <?php if($_POST['kaitouran18'] == 'STPマーケティング') $i++; ?> <?php if($_POST['kaitouran21'] == 'ア') $i++; ?> <?php if($_POST['kaitouran22'] == 'エ') $i++; ?> <?php if($_POST['kaitouran23'] == 'ウ') $i++; ?> <?php if($_POST['kaitouran311'] == 'c') $i++; ?> <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') $i++; ?> <?php if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran332'] == 'c') $i++; ?> <h1><?php print('正解数'.$i.'/14です'); ?></h1> </body> </html>

mauluru
質問者

補足

すいません。完全にsend()関数入れ忘れていました。 質問に載せられるようプログラム簡略化しました。 このプログラムは 各問と入力フォームが隠れており、各ボタンをおすと問題とフォームが出現します。 そしてsend()で各kaitouranを用意と空白のチェックを行っています。 送信ボタンを押したとき、入力されたフォームが正しければカウントアップされる仕組みになって押します。 以下htmlソースです。 <html> <head><head><title>タイトル</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript"> function hideForm1(){ document.getElementById("formblock1").style.display = "none"; } function showForm1() { document.getElementById("formblock1").style.display = "block"; } window.addEventListener("load", hideForm1); function hideForm2(){ document.getElementById("formblock2").style.display = "none"; } function showForm2() { document.getElementById("formblock2").style.display = "block"; } window.addEventListener("load", hideForm2); function hideForm3(){ document.getElementById("formblock3").style.display = "none"; } function showForm3() { document.getElementById("formblock3").style.display = "block"; } window.addEventListener("load", hideForm3); function send(){ function chk1(frm, names){ var r = true; for(var i = 0; i < names.length; i++) r &= (frm.elements[names[i]].value !=""); return r; } var r = true; r &= chk1(document.forms['nform'],['kaitouran11','kaitouran12','kaitouran13','kaitouran14','kaitouran21','kaitouran22','kaitouran23','kaitouran311','kaitouran312','kaitouran313','kaitouran321','kaitouran322','kaitouran323','kaitouran331','kaitouran332','kaitouran333','kaitouran334']); if(r){ document.forms['nform'].submit(); }else{ alert('解答欄に空白があります'); } } </script> </head> <body> <form> <input type="button" value="問1" onclick="showForm1(); this.disabled = true;"/> </form> <form> <input type="button" value="問2" onclick="showForm2(); this.disabled = true;"/> </form> <form> <input type="button" value="問3" onclick="showForm3(); this.disabled = true;"/> </form> <form name="nform" method="post" action="./Tkaitou1.php" enctype="multipart/form-data"> <div id="formblock1"> <p>問1</p> <p> ((1)<input type="text" name="kaitouran11" size="15">) ((2)<input type="text" name="kaitouran12" size="15">) ((3)<input type="text" name="kaitouran13" size="15">) ((4)<input type="text" name="kaitouran14" size="15">) ((5)<input type="text" name="kaitouran15" size="15">) ((6)<input type="text" name="kaitouran16" size="15">) ((7)<input type="text" name="kaitouran17" size="15">) ((8)<input type="text" name="kaitouran18" size="15">) </p> </div> <div id="formblock2"> <p>問2 </p> <p>問2-1問題文</p> <p> <input type="radio" name="kaitouran21" value="ア">ア <input type="radio" name="kaitouran21" value="イ">イ <input type="radio" name="kaitouran21" value="ウ">ウ <input type="radio" name="kaitouran21" value="エ">エ </p> <p>問2-2問題文</p> <p> <input type="radio" name="kaitouran22" value="ア">ア  <input type="radio" name="kaitouran22" value="イ">イ  <input type="radio" name="kaitouran22" value="ウ">ウ  <input type="radio" name="kaitouran22" value="エ">エ  </p> <p>問2-3問題文</p> <p> <input type="radio" name="kaitouran23" value="ア">ア  <input type="radio" name="kaitouran23" value="イ">イ  <input type="radio" name="kaitouran23" value="ウ">ウ  <input type="radio" name="kaitouran23" value="エ">エ  </p> </div> <div id="formblock3"> <p>問3 </p> <p>問3-1問題文</p> <p> a あ b い c う </p> <p> <input type="checkbox" name="kaitouran311" value="a">a <input type="checkbox" name="kaitouran312" value="b">b <input type="checkbox" name="kaitouran313" value="c">c </p> <p>問3-2問題文</p> <p> a あ b い c う </p> <p> <input type="checkbox" name="kaitouran321" value="a">a <input type="checkbox" name="kaitouran322" value="b">b <input type="checkbox" name="kaitouran323" value="c">c </p> <p>問3-3問題文</p> <p> a あ b い c う d え </p> <p> <input type="checkbox" name="kaitouran331" value="a">a <input type="checkbox" name="kaitouran332" value="b">b <input type="checkbox" name="kaitouran333" value="c">c <input type="checkbox" name="kaitouran334" value="d">d </p> </div> </form> <input type="button" value="送信" onclick="send()"> </body> </html>

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

ん~。それでは、「aとbとcが全部チェックが入っていたらカウントアップする」という仕様で間違いないのだね? もう少しソースを書いてくれたら分かるかも知れないが、仮に <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> $i++; というソースが本当にこの通りだとすると$i++はPHPじゃなくてHTMLだよね。つまり、 <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> <?php $i++; ?> あるいは <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') $i++; ?> じゃないとカウントアップはしない。 もう少し問題のソースの前後を書いてくれるとか、やりたい事をはっきりさせるとか、その方がより良い回答を得られやすいんじゃないか。

mauluru
質問者

お礼

以下今回作ったソースです。 htmlソース <html> <head><head><title>情報ネットワーク-テスト1</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form name="nform" method="post" action="./Tkaitou1.php" enctype="multipart/form-data"> <div id="formblock2"> <p> <input type="radio" name="kaitouran21" value="ア"> <input type="radio" name="kaitouran21" value="イ"> <input type="radio" name="kaitouran21" value="ウ"> <input type="radio" name="kaitouran21" value="エ"> </p> <p> <input type="radio" name="kaitouran22" value="ア"> <input type="radio" name="kaitouran22" value="イ"> <input type="radio" name="kaitouran22" value="ウ"> <input type="radio" name="kaitouran22" value="エ"> </p> <p> <input type="radio" name="kaitouran23" value="ア">ア  <input type="radio" name="kaitouran23" value="イ">イ  <input type="radio" name="kaitouran23" value="ウ">ウ  <input type="radio" name="kaitouran23" value="エ">エ </p> </div> <div id="formblock3"> <p> <input type="checkbox" name="kaitouran311" value="a">a <input type="checkbox" name="kaitouran312" value="b">b <input type="checkbox" name="kaitouran313" value="c">c </p> <p> <input type="checkbox" name="kaitouran321" value="a">a <input type="checkbox" name="kaitouran322" value="b">b <input type="checkbox" name="kaitouran323" value="c">c </p> <input type="checkbox" name="kaitouran331" value="a">a <input type="checkbox" name="kaitouran332" value="b">b <input type="checkbox" name="kaitouran333" value="c">c <input type="checkbox" name="kaitouran334" value="d">d </p> </div> </form> <input type="button" value="送信" onclick="send()"> </body> </html> php側のソース <html> <head> <title>解答</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type=""text/css""> #container{ width:1000 } #main{ width:500px; float:right; } #sidebar{ width:500px; float:left; } </style> </head> <body> <div id="container"> <div id="main"> <p>問題の解答</p> <p>問1</p> <p>(1)(2)(3)(4)(5)(6)(7)(8)</p> <p>問2</p> <p>(1)(2)(3)</p> <p>問2</p> <p>(1)(2)(3)</p> </div> <div id="sidebar"> <p><>あなたの解答<></p> <p> (1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> </p> <p> <?php print(htmlspecialchars($_POST['kaitouran311'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran312'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran313'], ENT_QUOTES, 'UTF-8')); ?> </p> <p> <?php print(htmlspecialchars($_POST['kaitouran321'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran322'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran323'], ENT_QUOTES, 'UTF-8')); ?> </p> <p> <?php print(htmlspecialchars($_POST['kaitouran331'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran332'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran333'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran334'], ENT_QUOTES, 'UTF-8')); ?> </p> </div> </div> <?php $i = 0; if($_POST['kaitouran21'] == 'ア') $i++; if($_POST['kaitouran22'] == 'エ') $i++; if($_POST['kaitouran23'] == 'ウ') $i++; if($_POST['kaitouran311'] == 'c') $i++; if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') $i++; if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran333'] == 'c') $i++; ?> <h1><?php print('正解数'.$i.'/14です'); ?></h1> </body> </html>

mauluru
質問者

補足

回答ありがとうございます。すいません。 質問内容が具体的でありませんでしたよね... html側から送られたフォームをphpで受け取るソースを作ったのですが、 if($_POST['kaitouran311'] == 'c') $i++; if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') $i++; if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran333'] == 'c') $i++; のところの条件を満たしてもカウントアップされず、チェックボックスの回答する部分が1つの場合カウントアップされるということです。 そのため、 if($_POST['kaitouran311'] == 'c') で条件を満たした場合はカウントアップが一回され if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') $i++; if($_POST['kaitouran331'] == 'a' && $_POST['kaitouran333'] == 'c') $i++; の部分では、条件を満たしてもカウントアップはスルーされてしまうのです。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

選択肢がひとつ、というのは「aかbかcのうちひとつにチェックを入れた」という意味なのかな? それなら <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> じゃなくて <?php if($_POST['kaitouran321'] == 'a' || $_POST['kaitouran322'] == 'b' || $_POST['kaitouran323'] == 'c') ?> なのではないかい?

mauluru
質問者

補足

回答ありがとうございます。orの条件が知りたいのではないです。Andの条件をやりたいのですが…上手くプログラムが動いてくれません。どのようにすればよろしいでしょうか?