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

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

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

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

Q&A

解決済

3回答

1296閲覧

PHP掲示板での削除機能実装について

prominence4563

総合スコア8

PHP

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

0グッド

0クリップ

投稿2017/08/25 00:50

編集2017/08/25 01:58

phpで掲示板に削除機能(指定した番号の項目を削除)をつけようと考えております。
以下のようなプログラムを組んだのですが、削除フォームに番号を打ち込んでも削除されません。
プログラム を実行した際にエラーもでないのでどこに原因があるかもわからず悩んでいます。
どなたか改善点を教えていただけませんか?

<!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>簡易掲示板</title> </head> <body> <form action="keijiban.php" method="post"> 名前<input type="text" name="name" ><br /> コメント<input type="text" name="comment"><br /> <br /> <input type="submit" value="送信" /> </form> <form action="" method="POST"> 削除対象番号<input type="text" name="deleteNo"> <input type="submit" name="delete" value="削除"> </form> <?php $filemei = 'keijiban.txt'; $num = file_exists($filemei) ? 1+count(file($filemei)) : 1; $str = $num. '<>' . $_POST['name'] . '<>' . $_POST['comment'] . '<>' . date('Y-m-d-H-i-s') . "\n"; $posts = file("keijiban.txt"); foreach($posts as $post){ list($num, $name, $message, $time) = explode("<>", $post); echo h($num); echo "<br>"; echo h($name); echo "<br>"; echo h($message); echo "<br>"; echo h($time); echo "<br>"; } function h($s) { return htmlspecialchars($s, ENT_QUOTES, "UTF-8", true); } if (isset($_POST["delete"])) { $delete = $_POST["deleteNo"]; $delCon = file("keijiban.txt"); for ($j = 0; $j < count($delCon) ; $j++){ $delData = explode("<>", $delCon[$j]); if ($delData[0] == $delete) { array_splice($delCon, $j, 1); file_put_contents($dataFile, implode("\n", $delCon)); } } } $fp = fopen("keijiban.txt", "r"); fclose($fp); $fp = fopen('keijiban.txt','a'); fwrite($fp, $str); fclose($fp); ?> </body> </html>

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

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

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

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

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

m.ts10806

2017/08/25 00:59

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)
m.ts10806

2017/08/25 01:01

ご提示のソースコードは「keijiban.php」でしょうか?
prominence4563

2017/08/25 01:15

keijiban.phpで間違いないです。コードについては訂正いたしました。
m.ts10806

2017/08/25 01:39

ではおそらく最初のformにもactionの指定は""でいいですね。私のサンプルコードの方も修正しておきました。
m.ts10806

2017/08/25 01:52

delete のところに  echo a;というのがあります。必要ない(例えばデバッグ用の記述)のであれば削除しておいてください。
guest

回答3

0

ベストアンサー

file_put_contents($dataFile, implode("\n", $delCon));

ここで$dataFileをいきなり使っているからでしょうかね。
$filemeiにすれば良いと思います。

PHP

1file_put_contents($dataFile, implode("\n", $delCon)); 23file_put_contents($filemei, implode("\n", $delCon));

補足
・ファイル名を$filemeiとして定義しているのに、使っていないところが多々あります
・削除処理でfile_put_contentsしたあとはbreakでループを抜けた方がよいでしょう
・削除時でも投稿処理が動いてしまっています

投稿2017/08/25 01:10

ttyp03

総合スコア16998

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

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

prominence4563

2017/08/25 01:26

回答ありがとうございます。 早速修正してみました所、確かに打ち込んだ番号が削除されるようになったのですが、表示がおかしなことになってしまいました。 具体的に言うと、削除するたびにコメントとコメントの間が広くなっていく上に投稿番号も異常なまでに飛びます。先ほどまで最新の番号が56だったのですが、いきなり200番台まで飛びました。どこに原因があるかわかりますでしょうか?
ttyp03

2017/08/25 01:30

おそらくですが、fileをデフォルトで使うと改行コード付きのまま配列に取り込まれます。 それなのにimplodeで\nを付加してしまっているので、削除するたびに空行が追加されていくのではないかと思います。 fileで改行なしオプション(FILE_IGNORE_NEW_LINES)を付加するか、implode時に\nを付加しないか、どちらかをやれば良いかと思います。
prominence4563

2017/08/25 02:06

implode内の\nを削除してみた所、不自然に空間が空いてしまう問題は解決いたしました。ありがとうございます! ですが、行数によって投稿番号を割り振っているというプログラムを組んでいるからだと思うんですが、削除した後に同じ番号が二つになってしまう現象が起こっています。例えば1.2.3.4.5まで表示されているときに2を消すと、1.3.4.5.5.6.7と表示されてしまいます。まだbreak処理の方は施していないのですが、そこに問題があるのでしょうか?それともそもそもの投稿番号の表示の仕方を変えた方がよろしいのでしょうか?
ttyp03

2017/08/25 02:10

投稿番号をファイルの行数+1で登録しているからですね。 これをファイル内最終行に登録されている投稿番号+1になるように処理を組んでみてください。 あと削除後に余計な行が追加されてしまうのは、補足に書いたように投稿処理も動いてしまっているからだと思います。
prominence4563

2017/08/30 07:43

返信が遅くなってしまい、申し訳ございません。投稿処理が動いてしまっているというのは具体的にどの部分が原因なのでしょうか?また、どのように変えたらよろしいのでしょうか?ここ数日の間で調べてみたのですが、いまいち解決策が分かりませんでした。よろしくお願いいたします。
prominence4563

2017/08/30 07:45

それとnumの部分を $line = file($filemei); $num = count($line); と変えてみたのですが、よりおかしくなってしまいました。どこを直せばよいのでしょうか?
ttyp03

2017/08/30 07:52

>投稿処理が動いてしまっている 最後のfopen~write~closeの処理です。 ここは無条件に毎回通ると思われます。 $numの処理はこんな感じにしてみてください。 $line = file($filemei); $lastline = explode("<>", $line[count($line)-1]); $num = $lastline[0];
prominence4563

2017/08/30 08:10

度々すみません。早速実装してみたのですが、なぜか投稿番号が全て消えてしまいました。テキストファイルの方も番号がありません。どういうことでしょうか?
ttyp03

2017/08/30 08:55

どういうことでしょうかね。 自分で調べてみましょう♪ 少なくとも先程の$numの処理は+1する必要がありました。すみません。 $num = $lastline[0] + 1; あとは私が言いたかったことはmts10806さんが全て書いてくださっています。
guest

0

テキストベースのデータ管理で削除機能はあまり現実的ではないかと
データ投入だけでなく更新削除が必要ならDBを検討ください

もしテキストで削除を実装するのであれば
別途idもしくは指定行に対して擬似的な削除情報をもって
読み込むけど表示しない処理にしたほうがよいでしょう。

投稿2017/08/25 01:33

yambejp

総合スコア114819

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

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

0

$dataFileという変数はどこにも出てきていないのにいきなり使われています。
ファイル名なので$filemeiを使いましょう。

他何点か気づき:

  • 投稿保存しているファイル名変数$filemeiを定義しているのに直にファイル名を書いているところが散見され、もったいない。
  • 提示のソースコードでは変数・配列のキーの未定義エラーが大量に出ると思います。

まずは未定義エラーが出ないように調整を行いましょう(@で制御するのではなく初期値を定義したり該当の変数の存在確認をした後に使ったりケースにより使い分けてください)

  • 提示のソースコードは開くたびに空の情報が連番で追加されます。

$strが最後に毎回fwriteで書き込まれているものと思われます。そもそもの作りを見直したほうが良いでしょう。

  • 名前・コメントが未入力の場合のチェックがないため、何もなしで投稿した際に正しく追記されない(前の投稿の末尾に番号だけ追記される)
  • 現状だと「HTML出力」→「削除」→「投稿書き込み」としているため、「削除を実行したものの削除直後は削除したはずのコメントが表示される(ページを読み直すと表示はされない)」という現象が起きるはずです。

「$_POST受け取って投稿書き込み or 削除の処理」→「最新のコメント取得」→「HTML表示(中にコメント展開)」とした方が良いです。
せっかく投稿と削除のformをわけるところまで出来ているので、下記のようにすることで読みやすく、メンテナンスもしやすいソースとなるはずです。
※簡略ソースのためポイントのみ記述しています

PHP

1<?php 2$filemei = 'keijiban.txt'; //最初に定義しておき他の処理で利用する 3 4//submitでPOST送信された場合のみ実行 5if($_SERVER["REQUEST_METHOD"] == "POST"){ 6 //送信されたフォームにより処理を分岐 7 $error_name = null; 8 $error_comment = null; 9 $error_delete_no = null; 10 switch($_POST["mode"]){ 11 case "add": 12 //名前・コメント未入力のチェック 13 //投稿追加処理 14 break; 15 case "delete": 16 //行番号未入力&数字じゃない場合のチェック 17 //投稿削除処理 18 break; 19 } 20} 21 22//コメント取得処理 23//全てのコメントを変数で受け取る 24$comment = null; 25$posts = file($filemei); 26 foreach($posts as $post){ 27 list($num, $name, $message, $time) = explode("<>", $post); 28 $comment.= h($num); 29 $comment.="<br>"; 30 $comment.=h($name); 31 $comment.="<br>"; 32 $comment.=h($message); 33 $comment.="<br>"; 34 $comment.=h($time); 35 $comment.="<br>"; 36 } 37 38//HTML出力 39?> 40<!DOCTYPE html> 41<html lang="ja"> 42<head> 43~~ 44 <form action="" method="post"> 45名前<input type="text" name="name" ><?php echo $error_name ?><br /> 46コメント<input type="text" name="comment"><?php echo $error_comment ?><br /> 47 <br /> 48 <input type="submit" value="送信" /> 49<input type="hidden" name="mode" value="add"> 50 </form> 51 <form action="" method="POST"> 52削除対象番号<input type="text" name="deleteNo"> <?php echo $error_delete_no ?> 53 <input type="submit" name="delete" value="削除"> 54<input type="hidden" name="mode" value="delete"> 55 </form> 56<?php 57//投稿コメント出力 58echo $comment; 59?> 60 61</body> 62</html>

投稿2017/08/25 01:31

編集2017/08/25 02:06
m.ts10806

総合スコア80850

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

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

prominence4563

2017/08/25 02:15

ソースコードを書いていただきありがとうございます。 あとはこのコードのどの部分を補足すればよいか実行して確認してみました。 コメントを入力してもテキストファイルが自動作成されずコメントが表示されなかったので、出力の部分を追加するってことで合ってますか?
m.ts10806

2017/08/25 02:36 編集

コメントで書いているところに処理を追加する感じですね。 私の方では、一応、今回ご提示いただいた各処理を追加して投稿・削除ができることは確認しました。 ※ttyp03さん指摘の部分も反映しないといけないので大変かと思いますが・・・。 今回のポイントは「投稿処理と削除処理を明確に分けて、各処理を行った後に最新のコメント情報を取得する」です。 各処理を適切なタイミングで適切に実行する(関係のない処理は動作させない)ことは覚えておいて損はありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問