【PHP】phpでDB不要のアンケート機能を作成する
フォームデータをファイルに書き込む/出力する
前回はこちら
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);