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

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

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

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

Q&A

解決済

3回答

532閲覧

簡要掲示板の編集機能

hellommm

総合スコア49

PHP

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

0グッド

0クリップ

投稿2018/03/02 17:46

簡要掲示板を作るという自分への課題をしております。
HMTLフォームから名前、コメントを入力しテキストファイルに
番号<>名前<>コメント<>日時を保存し、HTMLフォームの下に表示するというものを
作っております。

やりたい事
指定された投稿番号のものだけ編集できるようにする。
自分なりに調べながらコードを書いてみたのですが、editを押すと、フォームの下に表示されていた
投稿が消えるだけです。
テキストファイルにはなんの影響もありません。

あと、編集かどうかわかるように<input type="hidden">タグを用いて、編集モードかどうかを判別する
この意味がよく分かりません。

未熟者ですが、よろしくお願いします。
一応入力フォームの写真を貼っておきます
以下コード

php

1<?php 2header('Content-Type: text/html; charset=UTF-8'); 3 4require_once('Kadai2_15.php'); 5?> 6<html> 7 <head> 8 <meta charset="utf-8"/> 9 <title>sample</title> 10 </head> 11 <body> 12 <form method="post" action="<?php echo($_SERVER['PHP_SELF']) ?>"> 13 <p>名前:</p> 14 <input type="text" name="name" placeholder="山田太郎" required="required" value="<?php echo $simEdit[1]; ?>"> 15 <p>コメント:</p> 16 <textarea type="text" name="com" maxlength="20" required><?php echo $simEdit[2]; ?></textarea> 17 <!-- <input type="hidden" name="token" value="<?=h(sha1(session_id())) ?>"> --> 18 <input type="submit" name="mode" value="add"> 19 </form> 20 <form action="<?php echo($_SERVER['PHP_SELF']) ?>" method="POST"> 21 <p>削除対象番号:</p><!-- 削除対象番号 --> 22 <input type="text" name="deleteNo"> 23 <input type="submit" name="delete" value="削除"> 24 <input type="hidden" name="mode" value="delete"> 25 </form> 26 <form method="POST" action="<?php echo($_SERVER['PHP_SELF']) ?>"> 27 <p>編集対象番号:</p><!-- 編集対象番号 --> 28 <input type="text" name="edit"><br> 29 <input type="submit" name="mode" value="edit"> 30 </form> 31 <p> 32 <p> 33 掲示板: 34 </p> 35 <?php 36 37 foreach ((array)$text_rows as $text_row) {//配列でcount<>name<>comment<>data表示 38 if($text_row === ""){ 39 continue; 40 } 41 $ret = explode("<>", $text_row); 42 echo h($ret[0])."番 "; 43 echo h($ret[1])." さん "; 44 echo h($ret[2])." "; 45 echo h($ret[3]); 46 echo "<br>"; 47 48 } 49 ?> 50 51 </p> 52 </body> 53</html>

php

1<?php 2header('Content-Type: text/html; charset=UTF-8'); 3?> 4<html> 5 <head> 6 <meta charset="utf-8"/> 7 <title>sample</title> 8 </head> 9 <body> 10 11 <?php 12 13 function h($str) { 14 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 15 } 16 17 //session_start(); // 1 18 19 $name = (string)filter_input(INPUT_POST, 'name'); //名前フォーム値 文字列にキャスト 20 $comment = (string)filter_input(INPUT_POST, 'com');//コメントフォーム値 フィルタリングする 21 //$token = (string)filter_input(INPUT_POST, 'token'); // トークンセッション 22 $fileName = 'Kadai2_15.txt'; 23 24 switch($_POST["mode"]){ 25 case "add"://投稿追加処理 26 $fp = fopen($fileName, 'a+'); 27 if ($_SERVER['REQUEST_METHOD'] === 'POST'/* && sha1(session_id()) === $token */) { // postが送られて来てるか?CSRF対策 28 flock($fp, LOCK_SH); 29 $text_rows = file($fileName); 30 $lastline = explode("<>", $text_rows[count($text_rows)-1]);//行数をカウント 31 $num = $lastline[0]; 32 $add_text = ($num + 1)."<>".$name."<>".trim($comment)."<>".date('H時i分');//追加したい文章 33 array_unshift($text_rows, $add_text); 34 flock($fp, LOCK_EX); 35 fwrite($fp, $add_text."\n"); 36 flock($fp, LOCK_UN); 37 fclose($fp); 38 } 39 break; 40 case "delete"://投稿削除処理 41 if (isset($_POST["delete"])) { 42 43 $fp = fopen($fileName, 'a+'); 44 $delete = $_POST["deleteNo"]; 45 flock($fp, LOCK_SH); 46 $delarray = file($fileName); 47 //var_dump($delarray); 48 for ($j = 0; $j < count($delarray) ; $j++){ 49 $delData = explode("<>", $delarray[$j]); 50 if ($delData[0] == $delete) { 51 array_splice($delarray, $j, 1); 52 file_put_contents($fileName, implode($delarray)); 53 flock($fp, LOCK_UN); 54 fclose($fp); 55 break; 56 } 57 58 } 59 60 break; 61 } 62 case "edit"://投稿編集処理 63 if (isset($_POST["edit"])) { 64 65 $fp = fopen($fileName, 'a+'); 66 $edit = $_POST["edit"]; 67 flock($fp, LOCK_SH); 68 $editarray = file($fileName); 69 //var_dump($delarray); 70 for ($j = 0; $j < count($editarray) ; $j++) { 71 $ediData = explode("<>", $editarray[$j]); 72 if ($ediData[0] == $edit) { 73 //$simEdit = explode("}<>{", $ediCon[$k]); 74 for($h = 0; $h < count($editarray); $h++){ 75 $simEdit[$h] = mb_substr(trim($editarray[$h]), 1, -1); 76 flock($fp, LOCK_UN); 77 fclose($fp); 78 break; 79 } 80 } 81 } 82 } 83 84 } 85 86 87 88 ?> 89 </body> 90 91</html>

イメージ説明

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

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

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

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

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

guest

回答3

0

簡「易」掲示板ですかね?
自分への課題であれば、もう少しちゃんと勉強した方がいいですよ。
スクリプトがネットの情報のただのツギハギになっています。

学習するのであればデバッグ環境を整えて、変数の変化を確認してください。
意図していない変数の箇所を洗い出す時間が格段に早くなります。

今回のケースだと、POST をちゃんと見てみると良いです。
意図した方法になっていないはずなので、投稿方法を検討する必要があります。

完全に余談になりますが、セキュリティを意識したスクリプトにするなら
<?php echo($_SERVER['PHP_SELF']) ?>
はもう少し丁寧に扱ってください。

投稿2018/03/02 18:04

編集2018/03/02 18:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/02 23:47

(*´艸`)。o○(物理削除ができてるのに変更できないとかおかしなひとですよね)
guest

0

ベストアンサー

前はあえて確認しませんでしたが、
自身が書いたプログラムのコードをどのコードが
どのような意図や意味があり、どのような効果があるか、機能があるか
説明できますか?

作ることだけを先行して理解を疎かにしては既に指摘されている通りツギハギなコードとなり、
いつまでたっても完成しません。

1つ1つの機能を着実に理解し、細分化して学んでいく必要があります。
掲示板というのはCRUD(そのまま検索すれば出てくるので調べてください)が全て詰まっているもので
学ぶには良いですが、そもそもコードを書くというところで、ただ何の意識も意思もないまま書いても
おそらく思ったものは出来上がらないでしょう。

質問に上がっている内容を解決するだけなら簡単です。
ただ、それでは質問者さんのためになりません。
このteratail内には同様に、理解が届かないままやっていていつまでも同じ個所を質問していて
完成していない質問者が散見されます。
同じ道を辿らないためには基礎の理解が不可欠です。
つまり、自身が書いたコードをきちんと理論的に説明できるようになること、です。
がんばってください。

投稿2018/03/02 23:31

m.ts10806

総合スコア80765

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

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

hellommm

2018/03/04 14:41

ありがとうございます。 一から確認してみようと思います!
guest

0

別の方もかかれていますが、まずはデバッグ(泥臭いですが、色々なところにprintやvar_dumpを仕込んでみたり)して、変数にちゃんと意図した値が入っているかチェックだと思います。

またプログラムを自分の頭の中で一ステップずつ追ってみることも意外と有効だったりします。何か異変に気づくかもしれません。

余談ですが、掲載されたプログラムが質問者さん作成のものであれば、もう少しプログラムの読みやすさを意識されたほうがよいかと思います。
最低限、インデントをスペース4文字ないしはタブで統一することで読みやすくなります。

インデント見直し前

php

1 for ($j = 0; $j < count($delarray) ; $j++){ 2 $delData = explode("<>", $delarray[$j]); 3 if ($delData[0] == $delete) { 4 array_splice($delarray, $j, 1); 5 file_put_contents($fileName, implode($delarray)); 6 flock($fp, LOCK_UN); 7 fclose($fp); 8 break; 9 } 10 11 }

インデント見直し後+α

php

1 for ($j = 0; $j < count($delarray); $j++) 2 { 3 $delData = explode("<>", $delarray[$j]); 4 if ($delData[0] == $delete) 5 { 6 array_splice($delarray, $j, 1); 7 file_put_contents($fileName, implode($delarray)); 8 flock($fp, LOCK_UN); 9 fclose($fp); 10 break; 11 } 12 }

投稿2018/03/02 23:54

bassbone

総合スコア767

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問