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

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

ただいまの
回答率

87.37%

PHPでアンケート結果の表示と結果の保存ができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,803

score 23

PHP初心者です。
PHPでアンケートフォームを作っているのですが、アンケート結果の表示と結果の保存が
うまくいきません。

エンケートフォームを入力
エラーがある場合
->戻ってアンケートの項目全てにお答えください。
エラーがない場合
->アンケート結果を受け付けました!!!

上記のようにさせたいのですが、今の現状だと、
アンケートを入力してもしなくても、「アンケート結果を受け付けました!!!」
と表示され、本来エラーとして表示されるべきものが、エラーとして表示されません。
多分、データがうまくPOSTされておらず、データの精査が出来ていないからだと思うのですが、
POSTされない理由が全く解りません。
     

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="description" content="アンケートフォーム">
<title>アンケートフォーム</title>
</head>

<body>

<h2>アンケートフォーム</h2>
<form action="question2.php" method="post">
<dl class="clearfix">
<dt>性別は?</dt>
<dd>
<?php
$male = '男性';
$female = '女性';
$number = array('1' , '2');

echo ' <label><input type="radio" name="gender" value="' . $number[0] . '" />'
.  $male . '</label>' . "¥n";

echo ' <label><input type="radio" name="gender" value="' . $number[1] . '" />'
.  $female . '</label>' . "¥n";
?>
</dd>

<dt>年齢は</dt>
<dd>
<label>
<select name="age">
<option value="0" selected="selected">選択してください</option>
<?php
for ($num = 1; $num <= 4; $num++){
echo '<option value = "' . $num . '">' . $num . '0代</option>' . "¥n";
}
?>
<option value="5">50代以上</option>
</select>
</label>
</dd>

<dt>趣味は?</dt>
<dd class="hobby-area">
<?php
$hobby = array( 1 => '音楽鑑賞',
2 => '映画鑑賞',
3 => 'ドライブ',
4 => '旅行',
5 => 'その他');
foreach ($hobby as $key => $value) {
echo ' <label><input type="checkbox" name="hobby[' . $key . ']" value="'
. $key . '" />' . $value . '</label>' . "¥n";
}
?>
</dd>
</dl>

<p>
<input type="submit" value="投票する" />
</p>
</from>

<p class="copy">
&copy; 2010 PHP for web designer All fights reserned.
</p>
</body>
</html>


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="description" content="アンケート結果を送信しました">
<title>アンケート結果を受け付けました!!!</title>
</head>
<body>
<div id="box">
<div id="header">
<h1>PHP for web Designer</h1>
</div>
<ul id="menu" class="clearfix"></ul>

<div id="main">
<h2>アンケートフォーム</h2>

<?PHP

$error = 0;
if (isset($_POST['gender'])) {
$gender = $_post['gender'];

if (ctype_digit($gender)) {
if(gender == 1){
$gendername = '男性';
} elseif ($gender == 2) {
$gendername = '女性';
} else {
$error = 1;
}
} else{
$error = 1;
}
} else {
$error = 1;
}

if (isset($_post['age'])) {
$age = $_post['age'];

if(ctype_digit('age')) {
if($age < 1 || $age > 5) {
$error = 1;
}
} else {
$error = 1;
}
} else {
$error = 1;
}

if (isset($_post['hobby'])) {
$hobby = $_post['hobby'];

if(is_array($hobby)){
foreach ($hobby as $value) {
if($value < 1|| $value >5){
$error = 1;
}
}
} else {
$error = 1;
}
} else{
$error = 1;
}

if ($error == 0) {
echo '<dl class="clearfix">';
echo '<dt>性別は?</dt><dd>' . $gendername . '</dd>';

if($age != 5) {
echo '<dt>年齢は?</dt><dd>' . $age . '0代</dd>';
}else{
echo '<dt>年齢は?</dt><dd>50代以上</dd>';
}

echo '<dt>趣味は?</dt>';
echo '<dd>';
foreach ($hpbby as $value) {
switch ($value) {
case 1:
echo '音楽鑑賞<br />';
break;

case 2:
echo '映画鑑賞<br />';
break;

case 3:
echo 'ドライブ<br />';
break;

case 4:
echo '旅行<br />';
break;

case 5:
echo 'その他<br />';
break;
}
}

echo '</dd>';

$textfile = 'Applications/MAMP/log/log.txt';
$fp = fopen($textfile, 'r+b');
if(!$fp) {
exit('ファイルがないか異常があります');
}
if(!flook($fp,LOCK_EX)){
exit('ファイルをロックできませんでした');
}
while(!feof($fp)){
$writebuffer[] = trim(fgets($fp));
}

if($gender == 1) $writebuffer[0]++;
if($gender == 2) $writebuffer[1]++;

$writebuffer[$age + 1]++;

foreach ($hobby as $key => $value) {
$writebuffer[$key + 6]++;
}

$writebuffer[12]++;

rewind($fp);
foreach ($writebuffer as $value) {
fwrite($fp, $value . "¥n");
}
fclose($fp);

echo '</dl>';
echo '<p class="app_msg">以上の内容を保存しました!</p>';
echo '<p class="app_msg"><a href="question3.php">集計結果を見る</a></p>';
}else{
echo '<p class="app_msg">';
echo '戻ってアンケートの項目全てにお答えください。';
echo '</p>';
}
?>

<dl class="clearfix"></dl>
<p class="app_msg">以下の内容を保存しました!</p>
<p class="app_msg"><a href="qustion3.php">集計結果を見る</a></p>
</div>

<p class="copy">
&copy; 2010 PHP for web designer. ALL rights reserved.
</p>
</div>
</body>
</html>


0.男性
1.女性
2.10代
3.20代
4.30代
5.40代
6.50代以上
7.音楽鑑賞
8.映画鑑賞
9.ドライブ
10.旅行
11.その他
12.アンケート回答述べ人数

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2019/02/07 07:19

    前の質問未解決のまま放置はダメですよ。
    https://teratail.com/questions/172439
    回答もついてるに無反応のままではかなり失礼です。

    キャンセル

  • Cherry1217

    2019/02/07 21:43

    返信が遅くなりすみません。
    一応<code>は使用しているつもりですが、もしかしたら使い方が間違っているかもしれません。
    問題としては、アンケートが入力されていれば、'アンケート結果を受け付けました'、
    未入力があれば、'戻ってアンケートの項目全てにお答えください。'と表示させたいのですが、
    現状、アンケートが入力されていようがされてまいが、'アンケート結果を受け付けました'と表示されます。
    多分、POSTが上手く動いてくれていないからだと思うのですが、プログラムの何処が悪いのか全く分からないところで止まっています。

    キャンセル

  • m.ts10806

    2019/02/07 21:50

    ><code>は使用しているつもりですが
    いえどこにもその様子はないです。
    わからなければ質問編集画面でコードを編集状態にし<code>ボタンを押してください。
    するとこうなって
    ```ここに言語を入力
    //実際のコード
    ```
    「ここに言語を入力」というのが選択状態に切り替わるので
    「PHP」とか言語名にかえるといいです。
    ```PHP
    //実際のコード
    ```
    ちなみに開始の```の前には改行が必要。終了の```の前後に改行を入れてください。

    ```PHP
    echo "Hello World";

    ```
    あとは回答がついているのでそちらを参照してください。
    PHPは変数は大文字小文字を大別します。$aと$Aは別物です。

    キャンセル

回答 1

checkベストアンサー

+1

$_postではなく$_POSTですね
あと、question2.phpの<!DOCTYPE html>の前にアンケート入力チェック
及びファイルに書き出す処理を行い正常かどうかわかってから、HTML部分を出したほうがいいです。
(が今回はできるだけソース原型を留めるためやらない)

雪のため暇になったので動かすまでやってみた限り

if(gender == 1){$ついてないからだめ
ctype_digit('age')ctype_digit($age)のはず
foreach ($hpbby as $value) {foreach ($hobby as $value) {のはず
if(!flook($fp,LOCK_EX)){if(!flock($fp,LOCK_EX)){
fcloseのまえにflock($fp, LOCK_UN);を一応入れる
エディタ上で見た目上同じだったので分かりづらかったけど"¥n""\n"(文字コードが違う)
PHP処理終了後の

<dl class="clearfix"></dl>
<p class="app_msg">以下の内容を保存しました!</p>
<p class="app_msg"><a href="qustion3.php">集計結果を見る</a></p>
</div>


は不要(php処理で出してるため)

※アンケート集計処理部分はなんにも見てないし書き込まれるまでしか見てないしそこはせめてやって。

qustion2.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="description" content="アンケート結果を送信しました">
<title>アンケート結果を受け付けました!!!</title>
</head>
<body>
<div id="box">
<div id="header">
<h1>PHP for web Designer</h1>
</div>
<ul id="menu" class="clearfix"></ul>

<div id="main">
<h2>アンケートフォーム</h2>

<?php
    $error = 0;
    if (isset($_POST['gender'])) {
        $gender = $_POST['gender'];

        if (ctype_digit($gender)) {
            if($gender == 1){
                $gendername = '男性';
            } elseif ($gender == 2) {
                $gendername = '女性';
            } else {
                $error = 1;
            }
        } else{
            $error = 1;
        }
    } else {
        $error = 1;
    }

    if (isset($_POST['age'])) {
        $age = $_POST['age'];

        if(ctype_digit($age)) {
            if($age < 1 || $age > 5) {
                $error = 1;
            }
            } else {
                $error = 1;
            }
        } else {
            $error = 1;
    }
    if (isset($_POST['hobby'])) {
        $hobby = $_POST['hobby'];

        if(is_array($hobby)){
            foreach ($hobby as $value) {
                if($value < 1|| $value >5){
                    $error = 1;
                }
            }
        } else {
            $error = 1;
        }
    } else{
        $error = 1;
    }

    if ($error == 0) {
        echo '<dl class="clearfix">';
        echo '<dt>性別は?</dt><dd>' . $gendername . '</dd>';

        if($age != 5) {
            echo '<dt>年齢は?</dt><dd>' . $age . '0代</dd>';
        }else{
            echo '<dt>年齢は?</dt><dd>50代以上</dd>';
        }

        echo '<dt>趣味は?</dt>';
        echo '<dd>';
        foreach ($hobby as $value) {
            switch ($value) {
            case 1:
                echo '音楽鑑賞<br />';
                break;

            case 2:
                echo '映画鑑賞<br />';
                break;

            case 3:
                echo 'ドライブ<br />';
                break;

            case 4:
                echo '旅行<br />';
                break;

            case 5:
                echo 'その他<br />';
                break;
            }
        }

        echo '</dd>';

        $textfile = 'log.txt';
        $fp = fopen($textfile, 'r+b');
        if(!$fp) {
            exit('ファイルがないか異常があります');
        }
        if(!flock($fp,LOCK_EX)){
            exit('ファイルをロックできませんでした');
        }
        while(!feof($fp)){
            $writebuffer[] = trim(fgets($fp));
        }

        if($gender == 1) $writebuffer[0]++;
        if($gender == 2) $writebuffer[1]++;

        $writebuffer[$age + 1]++;

        foreach ($hobby as $key => $value) {
            $writebuffer[$key + 6]++;
        }

        $writebuffer[12]++;

        rewind($fp);
        foreach ($writebuffer as $value) {
            fwrite($fp, $value . "\n");
        }

        flock($fp, LOCK_UN);
        fclose($fp);

        echo '</dl>';
        echo '<p class="app_msg">以上の内容を保存しました!</p>';
        echo '<p class="app_msg"><a href="question3.php">集計結果を見る</a></p>';
    }else{
        echo '<p class="app_msg">';
        echo '戻ってアンケートの項目全てにお答えください。';
        echo '</p>';
    }
?>

<p class="copy">
&copy; 2010 PHP for web designer. ALL rights reserved.
</p>
</div>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 22:15

    回答ありがとうございます。
    回答で頂いたPHPを追加してみたのですが、’正常終了時のHTML出力’の文言が
    追加されるだけでした。

    キャンセル

  • 2019/02/11 16:28

    ありがとうございます。
    無事解決できました。
    もう一つ質問?というか、テクニックについてなんですが、上記のようなタイプミスというのは、
    どうやって見つけているのでしょうか。
    何回も見直しているのですが、全く気付きません。
    効率的な'構文チェック'や'タイプチェック'などの方法はないでしょうか。

    キャンセル

  • 2019/02/11 17:36

    apache上で動いてたら、/var/log/httpd/error_logにでます。
    また、
    https://qiita.com/shotets/items/3c95aef631b2c5eadae5
    を設定するとかですね

    キャンセル

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

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

関連した質問

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