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

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

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

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

Q&A

解決済

2回答

7921閲覧

php 簡易掲示板 削除機能について

dongu0223

総合スコア15

PHP

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

0グッド

1クリップ

投稿2018/12/28 00:16

今phpで簡易掲示板の作成をしています。
削除機能を付けたいのですが、
現状として

①「削除」の送信ボタンを二回押さないと更新されない
②入力フォームの下に表示されるのが、最新のフォームのみ
(本当はテキストファイルに書き込まれている内容全部を表示したい)

となっています。
改善のアドバイスお願いします!

<html> <html lang = "ja"> <head> <meta charset = "utf-8"> </head> <body> <form method= "post" action="mission_2-3.php"> <input type="text" name="name"><br> <input type="text" name="comment"> <input type="submit"><br> <!--削除用の入力フォームを設置--> <input type="text" name="delete" value="削除対象番号"> <input type="submit" value="削除"><br> </form> <?php $filename="mission_2-1_shima.txt"; //入力フォームのデータを受け取る $name= ($_POST['name']); $comment = ($_POST['comment']); $delete= ($_POST['delete']); //日付データの取得 $date=date('Y年m月d日 H:i:s'); //投稿番号の取得 //テキストファイルにデータがない場合は1を指定 //テキストファイルにある場合は+1 if (file_exists($filename)){ $num=count(file($filename))+1; } else{ $num=1; } //まとめた変数 $newdate= $num."<>".$name."<>".$comment."<>".$date; //もしフォームが空じゃなかったら書き込みをする if (!empty($name) && !empty($comment)){ $fp = fopen($filename,'a'); fwrite($fp, $newdate."\n"); fclose($fp); } //削除番号に数字が入力された場合 $files=file('mission_2-1_shima.txt'); if(!empty($delete)){//条件分岐① //ファイルの中身を空にする $fp=fopen($filename,'w'); // ファイルを0に丸める ftruncate($fp,0); // ファイルポインタを先頭に戻す fseek($fp,0); foreach ($files as $file){//ループ処理① $words=explode("<>",$file); if($words[0] != $delete){//条件分岐② fwrite($fp,$file); }}//条件分岐②とループ処理②おわり fclose($fp); }//条件分岐①おわり echo "{$words[0]}{$words[1]}{$words[2]}{$words[3]}{$words[4]}"; echo "<br>"; ?> </body> </html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/12/28 00:27

面倒だからコード見てないけど 削除する前にセレクトしてはだめ
m.ts10806

2018/12/28 00:33

↑気づいていてあえて突っ込まず回答してみました。 (案2はそこを解消できるはずのコードですけど)
dongu0223

2018/12/28 00:44

削除する前にセレクトってどういうことですか?
m.ts10806

2018/12/28 00:49

ひとまずインデントをきちんとつけてみてください。 おかしいところがある程度見えてくるはずです。
papinianus

2018/12/28 01:11

//削除番号に数字が入力された場合、のところで削除前のデータを全部取得して、//ループ処理①で削除を判定する前に全件必ず$wordに保存していることを、削除する前にセレクトと仰っているものと思います。端的に$wordへの代入をfwriteと同じ位置でやればよいのでは?
m.ts10806

2018/12/28 01:22

作りがそもそも微妙なので「私ならこう作る」という感じで簡易雛形コードを回答に追記しました。 処理部分は書いていませんのでご自身で埋めるようにしてください。
guest

回答2

0

ベストアンサー

削除と登録 formを別けては。

html

1 <form method= "post" action="mission_2-3.php"> 2 3 <input type="text" name="name"><br> 4 <input type="text" name="comment"> 5 <input type="submit"><br> 6</form> 7<!--削除用の入力フォームを設置--> 8 <form method= "post" action="mission_2-3.php"> 9<input type="text" name="delete" value="削除対象番号"> 10 <input type="submit" value="削除"><br> 11</form>

それか、ボタンをinputではなくbuttonタグにして、nameとvalueをつけて分岐させる

html

1 <form method= "post" action="mission_2-3.php"> 2 3 <input type="text" name="name"><br> 4 <input type="text" name="comment"> 5 <button type="submit" name="mode" value="add">登録</button><br> 6 <input type="text" name="delete" value="削除対象番号"> 7 <button type="submit" name="mode" value="delete">削除</button><br> 8</form>

php

1if($_SERVER['REQUEST_METHOD'] === 'POST'){ 2 $sendmode = $_POST["mode"]; 3 switch($sendmode){ 4 case "add": 5 // 登録処理 6 break; 7 case "delete": 8 // 削除処理 9 break; 10 11 } 12} 13 14//取得処理 15 16 17//表示処理 18

雛形コード

私ならこういう風に作る という形の雛形を作りました。
それぞれ何をやっているか分からなければ調べてください。
出来上がっていない段階ではエラー表示は常時Onにしてどのようなエラー(変数未定義など警告レベルのものも含む)がおきても確認し、対応するようにしてください。

php

1<?php 2ini_set('display_errors', "On");//エラー表示強制ON 開発終了したら削除またはコメントアウトする 3 4$list = ""; //登録した情報表示用の変数初期化 5 6//POST送信されたときのみ処理を行う 7if($_SERVER['REQUEST_METHOD'] === 'POST'){ 8 if(array_key_exists("mode", $_POST)){ 9 $sendmode = $_POST["mode"]; 10 switch($sendmode){ 11 case "add"://登録 12 //必須項目など入力チェック処理 13 14 // 登録処理 15 16 break; 17 case "delete"://削除 18 //必須項目など入力チェック処理 19 20 // 削除処理 21 break; 22 default: 23 } 24 } 25} 26 27//取得処理 $listに追記していく 28 29?> 30<!DOCTYPE html> 31<html> 32<head> 33<meta charset="UTF-8"> 34<title>Insert title here</title> 35</head> 36<body> 37 38</body> 39</html> 40<form method="post"> 41 <input type="text" name="name" placeholder="名前"><br /> 42 <input type="text" name="comment" placeholder="コメント"><br /> 43 <button type="submit" name="mode" value="add">登録</button> 44</form> 45<form method="post"> 46 <input type="text" name="delete" value="" placeholder="削除対象番号"><br /> 47 <button type="submit" name="mode" value="delete">削除</button> 48</form> 49<?php echo $list?> 50</body> 51</html>

注意点:
0. 登録処理や削除処理をしてからデータを取得すること。現在のコードだとdeleteのときしかデータ取得して内容に見受けられる。一緒にしない。
0. 入力内容のチェックを行って必須項目や文字数オーバー(ここは仕様)のときはエラーメッセージを出すようにして登録処理・削除処理を行わないこと
nameとかcommentに<>って入ってたらどうする?対策を考えましょう
0. 入力された情報を画面に出力する際、HTMLエスケープを行うこと

Qiitaに初心者向けの記事もあがっているので、そちらも参考にしてください。

投稿2018/12/28 00:32

編集2018/12/28 01:21
m.ts10806

総合スコア80850

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

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

dongu0223

2018/12/28 00:50

formを分けるほうをやってみたのですが、 表示がなくなったのはどうすればいいですか?
m.ts10806

2018/12/28 00:58 編集

「表示がなくなった」の意味が分からないですね。 エラーは出ていませんか? PHPファイル冒頭に下記を追加してみてください。 ini_set('display_errors', "On"); まあ、望ましいのは「それか、」で書いた案2の方ですが。 処理がゴチャゴチャになって分かりづらいので。 「やってみた」のはいいですが、本当にこちらの想定通りに対応したか分からないので、 質問本文にコードを追記してください。
m.ts10806

2018/12/28 01:06

というか、この内容だとundefined index の警告は沢山でますね。
guest

0

①formを分けた
②表示機能のところでループ処理して$wordsを定義した

で直りました。

if (file_exists($filename)){ $num=count(file($filename))+1; } else{ $num=1; } //まとめた変数 $newdate= $num."<>".$name."<>".$comment."<>".$date; //もしフォームが空じゃなかったら書き込みをする if (!empty($name) && !empty($comment)){ $fp = fopen($filename,'a'); fwrite($fp, $newdate."\n"); fclose($fp); } //削除番号に数字が入力された場合 $files=file('mission_2-1_shima.txt'); if(!empty($delete)){//条件分岐① //ファイルの中身を空にする $fp=fopen($filename,'w'); // ファイルを0に丸める ftruncate($fp,0); // ファイルポインタを先頭に戻す fseek($fp,0); foreach ($files as $file){//ループ処理① $words=explode("<>",$file); if($words[0] != $delete){//条件分岐② fwrite($fp,$file); }}//条件分岐②とループ処理②おわり fclose($fp); }//条件分岐①おわり //表示機能 $files=file('mission_2-1_shima.txt'); foreach ($files as $file){ $words=explode("<>",$file); echo "{$words[0]}{$words[1]}{$words[2]}{$words[3]}{$words[4]}"; echo "<br>"; } ?> </body> </html>

投稿2018/12/28 02:00

dongu0223

総合スコア15

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

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

m.ts10806

2018/12/28 02:02

コメントでも別途指摘しましたけど、インデント きちんとしないとバグったときに原因究明に影響しますよ。コードも読みづらいですし
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問