Techvenience

Technology × Convenience - Vue / React / Next / Nuxt / ChatGPTなどのIT技術がもたらす便利さをお伝えします。最近はChatGPTなどのAI技術を使ってブログを書いています。

フォームデータをファイルに書き込む/出力する - 【PHP】phpでDB不要のアンケート機能を作成する

【PHP】phpでDB不要のアンケート機能を作成する

f:id:duo-taro100:20160218004611p:plain

フォームデータをファイルに書き込む/出力する

前回はこちら
www.sky-limit-future.com


アンケート結果をファイルに書き込んで、その値を出力する。
ファイル操作をfile.phpで実施。
index.phpはアンケートの表示画面。

■index.php
formのactionをindex.phpからfile.phpに変更しているので注意

<?php

?>
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>アンケート</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head>
    <body>
        <h1>どれが好き?</h1>
        <p>1,いちご</p>
        <p>2,みかん</p>
        <p>3,りんご</p>
            <button class="question-btn">1</button>
            <button class="question-btn">2</button>
            <button class="question-btn">3</button>
        <form id="question-form" action="file.php" method="post">
            <input type="hidden" id="hidden-btn" name="hidden-btn" value="">
        </form>
    </body>
    <script>
        $(function(){
            $('.question-btn').click(function(){
                var form1 = document.forms['question-form'];

                var ans = $(this).text();
                $('#hidden-btn').val(ans);

                form1.submit();
                return false;
            });
        })
    </script>
</html>


■file.php

<?php
// テキストファイルの名前
$fileName = "test.dat";
$errMessage = "エラーが発生しました。";
// フォームから送られてきた値
$answer = $_POST['hidden-btn'];

// キャッシュ削除
clearstatcache();

// test.datが存在するか確認
// 存在すればtrue
$isExist = file_exists($fileName);

if($isExist){

    // 値を取得
    // 取得できない場合はfalseが返るので、初期値設定
    // 今回は[0,0,0]を初期値としている
    $array = unserialize(file_get_contents($fileName));
    var_dump($array);
    if(!$array){
        $data = [0,0,0];
    } else {
        // 取得できた値を使う
        $data = $array;
    }

    /****** ↓共通化できそう *****/
    if($answer == "1"){
        // 元々の値を上書き
        $ansResult = $data[0];
        $ansResult++;
        $data[0] = $ansResult;
    } else if ($answer == "2") {
        // 元々の値を上書き
        $ansResult = $data[1];
        $ansResult++;
        $data[1] = $ansResult;
    } else if ($answer == "3") {
        // 元々の値を上書き
        $ansResult = $data[2];
        $ansResult++;
        $data[2] = $ansResult;
    } else {
        // 想定外の値
        echo $errMessage;
        exit();
    }

    var_dump($data);
    // $dataでファイルの中身を置き換える。(排他制御)
    file_put_contents($fileName, serialize($data), LOCK_EX);
    /****** ↑共通化できそう *****/

} else {
    // 存在しない場合は新しく作成
    $result = touch($fileName);
    if(!$result){
        // 作成失敗
        echo $errMessage;
        exit();
    }

    // [0,0,0]の配列を作成
    $data = [0,0,0];

    /****** ↓共通化できそう *****/
    // 結果を加算
    if($answer == "1"){
        // 元々の値を上書き
        $ansResult = $data[0];
        $ansResult++;
        $data[0] = $ansResult;
    } else if ($answer == "2") {
        // 元々の値を上書き
        $ansResult = $data[1];
        $ansResult++;
        $data[1] = $ansResult;
    } else if ($answer == "3") {
        // 元々の値を上書き
        $ansResult = $data[2];
        $ansResult++;
        $data[2] = $ansResult;
    } else {
        // 想定外の値
        echo $errMessage;
        exit();
    }
    // ファイルに保存
    file_put_contents($fileName, serialize($data), LOCK_EX);
    /****** ↑共通化できそう *****/
}

// キャッシュ削除
clearstatcache();

?>
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>アンケート</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.0/Chart.min.js"></script>
    </head>
    <body>
        <h1>どれが好き?</h1>
        <!-- コメントでご指摘いただいた点を修正しました。加瀬様ありがとうございました。 -->
        <!-- 誤っていた箇所 var_dumpはカッコで出力内容を括る必要があります<p><?php var_dump $answer; ?></p>-->
        <p><?php var_dump($answer); ?></p>
    </body>
</html>

解説はコメントの通り。
結果として、押したボタンの数字が表示されたらOK!

実装は結構適当で、アンケートが1個だったらこれでもいいけど、複数あって、選択肢の数が違うとかだと上記コードでは対応できない。
今回はサンプルなので、こんな感じでできるよという感じ。
もし汎用的に作るなら、もうちょっとちゃんと考えないと。

共通化できる箇所もあったけど、今はコピペで2箇所にある。

配列で保存する場合、file_put_contents()を使用する。
取得には、file_get_contents。

file_put_contents(ファイル名、保存する値, 排他制御などのフラグ);

file_get_contents(ファイル名);

また、保存する値に対しては「serialize」、取得する値に対しては「unserialize」が必要

serialize($data);

unserialize($data);

次回は3、ファイルから取得したPHPの値をjavascriptに渡す

www.sky-limit-future.com