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

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

ただいまの
回答率

88.62%

POSTで、未回答のラジオボタンはどう扱われるのか・未回答を未回答として扱いたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 576

george6493

score 15

 前提

アンケートフォームを用いて回答を集め、回答を$answersという配列に保存する、といったプログラムを書いています。
フォームには、
・ラジオボタン
・テキストエリア
といった要素が合計20個ほど並んでおり、
途中で回答内容によってJSで表示しないようにする質問がいくつかあります。

回答内容は、POSTを用いて送信されます。

そこで、全ての質問をrequiredにするのではなく、
未回答のものは未回答であると判定した上で「NoAnswer」という値を$answersに追加したい、と考えております。

しかし、この「未回答である」と判定することが難しく、困っております。
判定は以下のコードで行なっております。

foreach($single as $key=>$value){
    if(is_null($value) || $value == '' ){
        $answers[] = "NoAnswer";
    }else{
        $answers[] = $hvalue;
    }

まず、テキストエリアが空白であった場合は、以下のコードによりきちんと判定して「NoAnswer」をCSVに書き込むことができます。
しかし、ラジオボタンについては、上記のコードでは未入力であることは判定されず、$answersには何も追加されません。

試したこと

$_POSTの中身を見てみると、空白にしたtextareaの中には「string(0)」という値が入っていますが、未回答にしたラジオボタンはそもそも項目がありませんでした。
それでは、ラジオボタンについて、

isset($key)==FALSE


であれば、未回答であることがわかるのではないか、と考えたのですが、
これでもうまくいきませんでした。

未回答であることを判別するには一体どうすればいいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/11/16 11:14

    $singleは何のどのような値が入っているのでしょうか。var_export()で提示してください。

    キャンセル

  • george6493

    2018/11/16 11:29

    中身をそのまま見せることは職務上難しく…申し訳ございません。POSTの1つ目の項目のみ複数回答可能であるため個別に処理したかったので、$single = array_slice($_POST, 1)としております。

    キャンセル

  • m.ts10806

    2018/11/16 11:36 編集

    了解です。既に回答もついていることですし、おおよそ解決につながりそうに思いますので、そちら参考にしてみてください

    キャンセル

回答 3

+4

未回答であることを判別するには一体どうすればいいのでしょうか?

「未回答」を1つの選択肢として考慮するのであれば、「未回答」というラジオボタンを最初から選択した状態で用意する、のが正解ではないかと思います。ラジオボタンがないものを変換した場合、一度入力したものを未回答に戻せない、ということになります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/16 11:24

    ラジオボタンを隠した場合、隠す代わりに同じ名前で<input type="hidden">を追加しておいて、そちらから値は送る、というようにしてもいいかもしれません。

    キャンセル

  • 2018/11/16 16:29

    シンプルで美しい!と思いましたが、他のコードとの兼ね合いか、うまく動かず。。。しかし、「未入力を入力する」という考え方は参考になりました。ありがとうございました!

    キャンセル

checkベストアンサー

+1

基本的には、↓の考えかたで良いと思います

isset($key)==FALSE

ただ、$singleはおそらくPOST値なので、そもそも全項目のキーが含まれていないのでうまくいかないということだろうと思います。
これに対応するには、入力画面に出る項目を予め配列として保持しておいて、そちらをキーにしてforeachをかけてやるのがいいのではないかと思います

$inputitems = [];// 適切な内容となっているとして
foreach($inputitems as $inputitem) {
  if(!isset($single[$inputitem]) { $answers[] = "NoAnswer"; continue; }
  if($single[$inputitem] === '' ||  is_null($single[$inputitem]) { $answers[] = "NoAnswer"; continue; }
  $answers[] = $single[$inputitem];
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/16 16:30

    今後データベース参照等もやっていくにあたっても応用が効く考え方で非常に有益でした!ありがとうございました!

    キャンセル

+1

たとえばこう

<form method="post">
<input type="hidden" name="a0" value="1">
Q1:<input type="radio" name="a1" value="NoAnswer" style="display:none" checked>
<label><input type="radio" name="a1" value="1">1</label>
<label><input type="radio" name="a1" value="2">2</label>
<label><input type="radio" name="a1" value="3">3</label>
<hr>
Q2:<input type="text" name="a2" value="">
<hr>
<input type="submit" value="go">
</form>
<?PHP
$a0=filter_input(INPUT_POST,"a0");
$a1=filter_input(INPUT_POST,"a1");
$a2=filter_input(INPUT_POST,"a2");
if(!is_null($a0)){
  if($a2==="") $a2="NoAnswer";
  print_r([$a1,$a2]);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る