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

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

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

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

Q&A

解決済

3回答

2258閲覧

PHP簡易掲示板の作成(削除機能の追加)

tatsu31

総合スコア12

PHP

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

0グッド

0クリップ

投稿2017/08/29 16:04

編集2017/08/30 14:57

php初心者です。
phpで簡易掲示板を作成しています。
削除機能を実装したいのですがうまく書くことができません。
具体的にはformから送信された番号と等しい投稿番号のコメントが削除されるようにしたいです。どのように修正したら良いのかご回答よろしくお願い致します。
ソースは下記になります。

php

1<html> 2<body> 3<form action = "mission_2-4.php" method = "post"> 4 名前 : <br /> 5 <input type = "text" name = "name" size = 30 value = "" /><br /> 6 コメント : <br /> 7 <textarea name = "comment" cols = "30" rows = "5"></textarea><br /> 8 <br /> 9 <input type = "submit" value = "送信する" /><br /> 10 <br /> 11 削除番号 : 12 <input type = "text" neme = "delete" /> 13 <input type = "submit" value = "削除" /> 14</form> 15</body> 16</html> 17 18<?php 19if (((isset($_POST["name"])) && ($_POST["name"] != "")) or ((isset($_POST["comment"])) && ($_POST["comment"] != ""))) 20{ 21 if (isset($_POST["name"])) 22 { 23 $name = $_POST["name"]; 24 if( get_magic_quotes_gpc() ) { $name = stripslashes("$name"); } 25 $name = htmlspecialchars ($name); 26 $name = mb_substr ($name, 0, 30, 'UTF-8'); 27 } 28 if (isset($_POST["comment"])) 29 { 30 $comment = $_POST["comment"]; 31 if( get_magic_quotes_gpc() ) { $comment = stripslashes("$comment"); } 32 $comment = mb_substr ($comment, 0, 200, 'UTF-8'); 33 } 34 35 $fp = fopen("write.txt", "r"); 36 $number = fgets($fp); 37 $i = $number+1; 38 fclose ($fp); 39 $time = date("Y/n/j G:i"); 40 $write = $i . "<>" . $name . "<>" . $comment . "<>" . $time .PHP_EOL ; 41 $fp = fopen ("./log.txt","a+"); 42 flock ($fp, LOCK_EX); 43 fputs ($fp,$write); 44 flock ($fp, LOCK_UN); 45 fclose ($fp); 46} 47 48?> 49<?php 50if (((isset($_POST["name"])) && ($_POST["name"] != "")) or ((isset($_POST["comment"])) && ($_POST["comment"] != ""))) 51{ 52 53 $fp = fopen('write.txt', 'r'); 54 $number = fgets($fp); 55 $i = $number+1; 56 fclose($fp); 57 $fp = fopen('write.txt', 'w'); 58 fputs($fp, $i); 59 fclose($fp); 60 print "書き込み完了しました<br>"; 61} 62?> 63 64<?php 65$fp = fopen('log.txt', 'r'); 66while (!feof($fp)) 67{ 68 $line = fgets($fp); 69 print $line; 70 print "<br>\n"; 71} 72fclose($fp); 73?>

削除機能

php

1<?php 2if((isset($_POST["delete"])) && ($_POST["delete"] !="")) 3{ 4 if (isset($_POST["delete"])) 5 { 6 $delete = $_POST["delete"]; 7 if( get_magic_quotes_gpc() ) { $delete = stripslashes("$delete");} 8 $delete = htmlspecialchars ($delete); 9 } 10 11 $fp = fopen('log.txt', 'r'); 12 while (!feof($fp)) 13 { 14 $line = fgets($fp); 15 $del = explode("<>",$line); 16 } 17 fclose($fp); 18 19 if($del[0] != $delete) 20 { 21 $fp = fopen('log.txt', 'w'); 22 fwrite($fp,$line); 23 fclose($fp); 24 } 25 print "削除しました<br>"; 26 27} 28?> 29 30

追加・修正について
現在phpで簡易掲示板を作成しており、名前・コメントのいずれかの入力フォームから値が送信されると、ブラウザ上に"投稿番号<>名前<>コメント<>投稿時間"が表示されるようにしました。ここまでは実装することができました。

そこで次はこれらの投稿を削除する機能を実装したいです。具体的には、まず削除番号の項目のフォームから値が送信されるとPOSTで受け取り、その後、投稿内容が保存されている"log.txt"を読み込み、explode関数を用いて投稿番号を取得、行末までループさせます。その後取得した投稿番号と送信された値を比較して等しくない場合のみ投稿を"log.txt"に上書きすることによって、値と等しい投稿番号の書き込みを削除したいです。その削除機能を実装しようとしたのが上記です。
上記のコードではエラーは出ないのですが、送信しても何も起きず、printを用いて表示されるはずの"削除しました"も表示されません。ただ値を送信しただけになってしまいます。うまく値を受け取れていないような気がするのですが理由が分からない状態です。そのため、投稿番号を取得する部分や比較する部分のコードが正しいのかどうかも確認することができていないです。
インデックスはつけて修正しました。他にも読みづらい点があるとは思いますがどうかよろしくお願い致します。何か他にもありましたらご指摘よろしくお願い致します。

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

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

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

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

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

tanat

2017/08/29 17:01

現在のソースのうちどこまではわかっているのか(書き込み処理までは理解できているか)、何がどうわからないのか、何を試したらどうなったか、現在どのようなエラーが出ているかなど、わからない部分を出来る限り具体的に書いて下さい
num79kill

2017/08/30 01:22

インデントがないのは見づらい
guest

回答3

0

別解ですが、この様な書き方も出来るかと思います。
参考までに…

PHP

1<?php 2 if((isset($_POST["delete"])) && ($_POST["delete"] !="")){ 3 if (isset($_POST["delete"])){ 4 $delete = $_POST["delete"]; 5 if( get_magic_quotes_gpc() ) { $delete = stripslashes("$delete");} 6 $delete = htmlspecialchars ($delete); 7 } 8 $file = file('log.txt');//log.txt情報を読込 9 $cnt = 0; 10 foreach ($file as $value) { 11 $fileContent = explode('<>', $value); 12 if($fileContent[0] == $delete){//削除したい番号と1つめのカラムが一致したら… 13 unset($file[$cnt]);//一致した行を消す 14 file_put_contents('log.txt',$file);//更新後の配列をfile_put_contentsで上書き 15 break; 16 } 17 $cnt++; 18 } 19 print "削除しました<br>"; 20} 21?>

投稿2017/08/31 01:17

motuo

総合スコア3027

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

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

tatsu31

2017/09/01 01:37

等しい場合削除するということですね。回答ありがとうございます。参考にさせていただきます。
tatsu31

2017/09/03 14:11

お疲れ様です。こちらのコードを実行してみたのですがforeach文以降が実行されないです…何が原因かわかりますでしょうか…?
motuo

2017/09/04 07:39

私の環境では動作するので下記を確認して下さい。 ①入力のhtmlの<input type = "text" name = "delete" />のnameがnemeになっていないか?(質問文がそうなっていたので…) ②Log.txtの場所が誤っていないか?
guest

0

ノーチェックですが

PHP

1$fp = fopen('log.txt', 'r'); 2while (!feof($fp)){ 3$line = fgets($fp); 4$del = explode("<>",$line); 5} 6fclose($fp); 7 8if($del[0] != $delete) 9{ 10$fp = fopen('log.txt', 'w'); 11fwrite($fp,$line); 12fclose($fp); 13}

ここの部分

PHP

1$lines = []; 2$fp = fopen('log.txt', 'r'); 3while (!feof($fp)){ 4 $lines[] = fgets($fp); 5} 6fclose($fp); 7 8$fp = fopen('log.txt', 'w'); 9foreach($lines as $line) { 10 $del = explode("<>",$line); 11 if($del[0] != $delete) 12 { 13 fwrite($fp, $line); 14 } 15} 16fclose($fp);

こうでは?

投稿2017/08/29 17:31

rururu3

総合スコア5545

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

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

tatsu31

2017/08/30 15:11

回答ありがとうございます。 書いてみたところ1行目"lines = [];"がエラーとなったのですが、何が原因でしょうか。 また現在の状況などを質問に追記したので見ていただけると助かります。二度手間で申し訳ありません。
tatsu31

2017/09/01 01:40

ありがとうございます。参考にさせていただきます。
guest

0

ベストアンサー

まずはどこまで処理が進んでるかを確認する必要があります。
高機能な開発環境を使えばステップ実行などが出来ますが、
とりあえず、こんな感じでどこまで進んでるか確認できます。
(原始的で、ソースを汚してしまう方法ですが学習段階においては有効だと思います)

PHP

1<?php 2if((isset($_POST["delete"])) && ($_POST["delete"] !="")) 3{ 4 echo "step_1"; 5 if (isset($_POST["delete"])) 6 { 7 echo "step_2"; 8 $delete = $_POST["delete"]; 9 if( get_magic_quotes_gpc() ) { 10 echo "step_3" 11$delete = stripslashes("$delete");} 12 $delete = htmlspecialchars ($delete); 13 } 14 15 $fp = fopen('log.txt', 'r'); 16 while (!feof($fp)) 17 { 18 echo "step_4"; 19 $line = fgets($fp); 20 $del = explode("<>",$line); 21 } 22 fclose($fp); 23 24 if($del[0] != $delete) 25 { 26 echo "step_5"; 27 $fp = fopen('log.txt', 'w'); 28 fwrite($fp,$line); 29 fclose($fp); 30 } 31 echo "step_6"; 32 print "削除しました<br>"; 33 34} 35?>

で、どこまで進んだか確認出来たら、進んでいない分岐の直前あたりで、判定している変数をvar_dump()してみて、想定通りの値が入っているかどうかを確認してみてください。

投稿2017/08/30 17:04

tanat

総合スコア18709

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

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

num79kill

2017/08/30 23:21

error_log 関数なとでないそこは?
tanat

2017/08/31 00:52

補足ありがとうございます。 本来的にはもちろんそうなんですが、今回のケースだと最終的にソースに残すべきではない使い方なので、少しでも分かりやすい方が良いかと考えました。
tatsu31

2017/09/01 01:39

どこまでできているのかが確認できました。ありがとうございます。これを見ながら間違っている所を修正していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問