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

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

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

771閲覧

【PHP】チェックシートのステータスを更新していきたい

nsya18kmsk93

総合スコア1

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/19 06:58

本業がインフラの為、初心者な質問だったら申し訳ありません。

前提・実現したいこと

現在サーバーをセットアップするにあたってのチェックシートをnginx+PHPで作りたいと思っています。
今回DBを用意していない為、現在のチェックボックスのデータをstatus.csvとして出力し
それを更新の度に読み込み直せばチェックシートの進行を管理できるのでは?という想定でコードを書いてみました。

発生している問題・エラーメッセージ

問題が3つ発生しています。

  1. 現在のチェックボックスの状態をstatus.csvに吐き出す事は出来ているようなのですが、それを読み込む関数が調べても分かりませんでした。

  2. 状態が吐き出されたstatus.csvを確認してみるとon, on, の様な、チェックが入っている数はわかるものの、どこにチェックが入ったか、このcsvからだと読み取れない(と思われる)。

  3. status.csvがスタート時点だと空ファイルの為、以下のエラーが出てしまいます。

Warning: Undefined array key "status" in /var/www/html/test.php on line 26 Warning: foreach() argument must be of type array|object, null given in /var/www/html/test.php on line 26

該当のソースコード

test.php

PHP

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5<meta charset="utf-8"> 6<title>チェックシート</title> 7</head> 8 9<body> 10<h1>サーバーセットアップマニュアルチェックシート</h1> 11 12<form action="test.php" method="get"> 13<h2>物理作業</h2> 14// ←この辺にstatus.csvを読み込む記述が必要? 15<div class="boxes"> 16 <input type="checkbox" id="1-1-1" name="status[]"><label for="1-1-1">箱から出す</label><br> 17 <input type="checkbox" id="1-1-2" name="status[]"><label for="1-1-2">ホスト名のテプラを貼り付け</label><br> 18 <input type="checkbox" id="1-1-3" name="status[]"><label for="1-1-3">シリアルナンバーを控える</label><br> 19 <input type="checkbox" id="1-1-4" name="status[]"><label for="1-1-4">Ether Portのテプラを貼り付け</label><br> 20 <input type="checkbox" id="1-1-5" name="status[]"><label for="1-1-5">サーバーセットアップ一覧の更新</label><br> 21</div> 22 23<div align="center"> 24<?php 25 $myfile = fopen("status.csv", "w") or die("Unable to open file!"); 26 foreach($_GET["status"] as $value){ // ←この辺の処理を工夫しないといけない? 27 $content = "{$value}, "; 28 fwrite($myfile, $content); 29 } 30 fwrite($myfile, "\n"); 31 fclose($myfile); 32 33 print '<form action="test.php">'; 34 print '<input type="submit" value="更新">'; 35 print '</form>'; 36?> 37</div> 38</form> 39</body> 40</hmtl>

試したこと

$contentとstatus.csvに書かれているものは同じものでした。(echoで確認しました。)

PHPを書いたのも初めてなもので、恐らく色々わかっていない気がします・・・

補足情報(FW/ツールのバージョンなど)

Docker version:20.10.8, build 3967b7d
nginx image:nginx:stable-alpine
php image:php:fpm

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ファイルI/Oのところはとりあえずおいておいて
formなのですからvalue指定しないとだめです

PHP

1<form> 2<h2>物理作業</h2> 3<div class="boxes"> 4 <label><input type="checkbox" name="status[]" value="箱から出す">箱から出す</label><br> 5 <label><input type="checkbox" name="status[]" value="ホスト名のテプラを貼り付け">ホスト名のテプラを貼り付け</label><br> 6 <label><input type="checkbox" name="status[]" value="シリアルナンバーを控える">シリアルナンバーを控える</label><br> 7 <label><input type="checkbox" name="status[]" value="Ether Portのテプラを貼り付け">Ether Portのテプラを貼り付け</label><br> 8 <label><input type="checkbox" name="status[]" value="サーバーセットアップ一覧の更新">サーバーセットアップ一覧の更新</label><br> 9</div> 10<input type="submit" value="更新"> 11<hr> 12<?php 13$status=filter_input(INPUT_GET,"status",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 14foreach((array) $status as $value){ 15 $content = "{$value}, "; 16 print $content."<br>\n"; 17} 18

投稿2021/08/19 09:00

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nsya18kmsk93

2021/08/19 09:25

@yambejpさん ご回答ありがとうございます。 valueを入れてみたところ、status.csvに各項目名が入るようになりました。 ``` # cat status.csv 箱から出す, ホスト名のテプラを貼り付け, シリアルナンバーを控える, ``` ということは2.に関してはこれで解決出来た?のかな?
guest

0

自己解決

※解決はしましたが、万人にはお勧め出来ません!

最終的には以下のコードとなりました。

PHP

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5<meta charset="utf-8"> 6<title>チェックシート</title> 7<script language="JavaScript1.2"> 8function pageJump () { 9 if (!top.location.href.match(/?1$/)) { 10 top.location.href += "?1" 11 } 12} 13//--> 14</script> 15</head> 16 17<body onLoad='pageJump()'> 18<h1>サーバーセットアップマニュアルチェックシート</h1> 19 20<form action="test.php" method="get"> 21<h2>物理作業</h2> 22<div class="boxes"> 23 <input type="checkbox" id="1-1-1" name="status[]" value="1-1-1"><label for="1-1-1">箱から出す</label><br> 24 <input type="checkbox" id="1-1-2" name="status[]" value="1-1-2"><label for="1-1-2">ホスト名のテプラを貼り付け</label><br> 25 <input type="checkbox" id="1-1-3" name="status[]" value="1-1-3"><label for="1-1-3">PMSの確認</label><br> 26 <input type="checkbox" id="1-1-4" name="status[]" value="1-1-4"><label for="1-1-4">Ether Portのテプラを貼り付 け</label><br> 27 <input type="checkbox" id="1-1-5" name="status[]" value="1-1-5"><label for="1-1-5">シリアルナンバーを控える</label><br> 28 <input type="checkbox" id="1-1-6" name="status[]" value="1-1-6"><label for="1-1-6">サーバーセットアップ一覧の 更新</label> 29</div> 30 31<div align="center"> 32<?php 33 $myfile = fopen("status.csv", "w") or die("Unable to open file!"); 34 if (!empty($_GET["status"])) { 35 foreach($_GET["status"] as $value){ 36 $content = "{$value}, "; 37 fwrite($myfile, $content); 38 } 39 fwrite($myfile, "\n"); 40 fclose($myfile); 41 } 42 43 $out1 = shell_exec('sed -i \'/sed -i/! {/input type/s/ checked//g}\' test.php'); 44 echo $out1; 45 $out2 = shell_exec('cat status.csv | sed -e \'s/, /\n/g\' | grep -v ^$ | xargs -I{} sed -i \'/{}/s/><label for/ checked><label for/g\' test.php'); 46 echo $out2; 47 48 print '<form action="test.php">'; 49 print '<input type="submit" value="更新">'; 50 print '</form>'; 51?> 52</div> 53</form> 54</body> 55</hmtl>

ポイントとしては以下の4点。


  • @yambejpさんにご指摘頂いた、checkboxのvalue属性の付与

これがないと、チェックボックスのどこにチェックが付いたのかの情報が取れませんでした。


  • out1で現在のチェックをすべて削除した上で、out2でチェックを入れた箇所のコードにchecked属性を付与

ここが万人にお勧め出来ないポイントその1。コードを無理矢理sedで書き換えています。
地味にout1の条件式である、「input type」の文字列が入っている かつ 「sed -i」の文字列が入っていない、がミソです。後半の条件式が入っていないと、このsedのコマンド自体が書き換えられてしまいます。


  • JavaScriptでpageJump関数を定義し、一度だけページをリロード

万人にお勧め出来ないポイントその2です。PHPコードの書き換えだけではチェックボックスの状態が反映されない為、ページを開く度に一度だけページをリロードさせています。


  • $_GET["status"]の値が空かどうかのチェック

これによりWarningエラーが出なくなります。


かなりの力技ですが目的は達成しました。
本当なら2つ目の部分はPHPで書けるのでしょうが、変更箇所の条件式を指定しての置換方法がパッと出てこなかったので、sedで代用しました。
3つ目の部分は調べた感じ、PHPでのページリロードは出来ないという情報が多数だったのですが、普段皆さんはどのように処理しているのでしょうか?そもそもリロードしなくても処理できる、が正解?

投稿2021/08/23 08:45

編集2021/08/23 08:53
nsya18kmsk93

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問