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

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

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

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

Q&A

1回答

2061閲覧

php 簡易掲示板に削除機能を付けたいです

senma0011

総合スコア4

PHP

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

0グッド

0クリップ

投稿2019/08/25 15:48

編集2019/08/25 17:08

前提・実現したいこと

初心者です。簡易掲示板で番号を指定して投稿を削除したいです。
テキストファイルに投稿を 番号<>名前<>コメント<>日時<>改行コードで保存しています。
このテキストファイルを読み込んでexplode関数で<>で分割し番号を取得、この番号と等しい番号を投稿削除番号に入力した場合のみ削除を実行、その後テキストファイルと照らし合わせて等しくない場合には上書き保存をするコードをかこうとしています。

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

・エラーメッセージは出ない
・空白の場合の処理&投稿番号よりも大きな数を入力した際のerr3がうまく表示されない
・削除の処理もうまくいっていない
原因:根本的に削除のコードが間違っていると思います。

該当のソースコード

php

1<html> 2<head> 3 4<?php 5 6mb_language("Japanese"); 7 mb_internal_encoding("UTF-8"); 8$err1=""; 9$err2=""; 10$err3=""; 11 12$OK_message="";//初回のアクセス時には送信ボタンが押されていないため何も表示がないことをここに書き込んでおく 13$filename="mission_3-1.txt"; 14if(isset($_POST['send']) === true){//送信ボタンが押された場合に以下のプログラムを働かせるためtrueを使う 15 16 17if($_POST['name'] === ""){ 18$err1= "名前を入力してください";//===は左右がまったく同じ値の場合の意、==でもいいがこちらは意図しない相互変換が行われてしまい1==1aaでもtrueになることもある 19}; 20 21if($_POST['message'] === ""){ 22$err2= "コメントを入力してください"; 23}; 24 25if( $err1 === "" && $err2 ==="" ){//&&はどちらもという意味andよりも厳格、どちらもエラーでなくメッセージが表示されないときにはこの下のプログラムが動くように設定 26$name=$_POST['name']; 27$message=($_POST['message']); 28$time=date("Y/m/d G:i:s");//時間取得 29 30$filename="mission_3-1.txt"; 31if (file_exists($filename)) { 32 $count = count(file($filename))+1;//file関数を使い行ごとに配列を格納し、その行の数をカウント 33} else { 34 $count = 1;//もし何も書き込まれていない場合は1を返す 35}; 36$newdata = (count(file($filename))+1)."<>".$name."<>".$message."<>".$time."<>"."PHP_EOL";//php_eolの文字はfile型式に合わせた改行文字を打ってくれる 37//カウントした数に+1した値が次の投稿番号になる 38 39$fp=fopen($filename,"a"); 40fwrite($fp,$newdata); 41fclose($fp); 42 43$OK_message=$newdata."を受け付けました";//  .をnewdataの後に置くことで並列表示ができる 44 45};}; 46 47 48$delete=""; 49if(isset($_POST['send_delete']) === true){ 50$delete=$_POST['send_delete']; 51 52if($_POST['send_delete'] ===""){ 53 54 $err3="削除番号を入力してください"; 55}; 56 57if (file_exists($filename)) { 58 $count1 = count(file($filename)); 59}; 60 61if($_POST['send_delete']>$count1){ 62 63 64 65 $err3="投稿番号が見つかりません"; 66}; 67if($err3===""){ 68 69$filename="mission_3-1.txt"; 70$filedata = file($filename); 71$a=fopen($filename,"w"); 72@fwrite($a,""); 73fclose($a); 74 75for ($j = 0; $j < count($filedata); $j++) { 76$delDate = explode("'<>'", $filedata[$j]); 77array_splice($delDate,1); 78if ($delDate[0] != $delete) { 79 80$b = fopen($filename, "a"); 81 82@fwrite($b, $filedata[$j]); 83fclose($b); 84} elseif ($delDate[0] == $delete) { 85 86$c = fopen($filename, "a"); 87 88@fwrite($c, "消去しました。PHP_EOL"); 89fclose($c); 90echo "削除しました"; 91 }; 92 }; 93 94 95 96}; 97}; 98 99 100 101 102?><h1>掲示板</h1> 103<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 104</head> 105<body> 106<form action="mission_3-3.php" method="post"> 107<h3>投稿</h3> 108 <p><input type="text" name="name" value="名前" size="10"></p> 109 <p><input type="text" name="message" value="コメント" size="20"></p> 110 <p><input type="submit"name="send" value="送信する"></p> 111<h3>投稿削除</h3> 112 <p><input type="text" name="delete" value="削除番号" size="10"></p><!--削除番号の入力フォーム--> 113 <p><input type="submit"name="send_delete" value="送信する"></p> 114<?php 115echo $err1.'<br>'; 116echo $err2.'<br>'; 117echo $err3.'<br>'; 118 119echo $OK_message.'<br>'; 120?> 121</form> 122<h2>表示欄</h2> 123 124<?php 125$file_name = "mission_3-1.txt"; 126$data = file_get_contents($file_name); 127$data=explode("<>",$data);//<>でデータを分割して配列に格納 128$cnt = count($data);//分割したデータをカウント 129for ($i=0; $i<$cnt; $i++)//カウント数以下なら1を足した数値の数を表示 130{ 131 echo ($data[$i])."<br>"; 132 133} 134?> 135</body> 136</html> 137

試したこと

explodeで分割するところまではできたのですがその先がどう書いていいのかわからないです。他にも同じ質問してる人いるからそっちを参考にするようにと教えていただいたので現在はそちらを参考にしつつ修正中です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/25 15:53

ここ最近、この質問を複数見かけます。 アカウントを再登録までして同じ内容の質問は控えてください。
senma0011

2019/08/25 16:06

そうなんですね…申し訳ありません。私はどうしてもここが分からなくて先ほど初めてアカウントを登録しました。1週間ほど前からプログラミングを自力で勉強しています。この質問が多いのは単にプログラミングを勉強し始める人が同じ質問をするからだと思います。しかし、他人のソースを見たとしても自分のソースにどう取り入れるかは理解ができないとできないと思っています。ご不便をおかけしますが、荒らしだけでなく、資金力や時間はないけれどもプログラミングを勉強したいと思っている人もいることをわかっていただければと思います…
m.ts10806

2019/08/25 16:14

同じ質問がある=そこに解決策もある とは考えないのでしょうか。 そして同じ質問がある=同じ回答がつく とは考えないのでしょうか。 多くの回答者はasahina1979さんや私のよに、同じような質問をずっと見てきています。 そこであえて同じ回答をここにするのは非効率だと考え、過去質問へ誘導することになります。 つまり、(例え別人であっても)同じ内容で投稿しても回答はつかないと思って良いです。 過去質問で解決しないのでしたらその質問のURLと取り組んだことを具体的に記載し、 何を試したのか、その結果何が起きたのか、どう調べたのかも記載して質問するようにしてください。 なお、質問は編集できます。 また、コードを提示する際はマークダウンを利用してください(ヘルプページなども参照のこと)
senma0011

2019/08/25 16:20

ありがとうございます。もう一度自力で試してみます。もしそれでも解決できないようでしたらまたこの場で質問させていただきます。
senma0011

2019/08/25 16:32

asahina1979さんとm.ts10806さんのおっしゃるようにこのサイトで多くの同じ内容の質問があることを確認しました。そちらを参考にしたいと思います。夜分に失礼いたしました。それとありがとうございます!
m.ts10806

2019/08/26 00:26 編集

質問は回答がつく前ではあれば直接削除依頼もできますが、顛末を自分で質問に追記し もし調べて試す中で自己解決できたならそれも回答として自身で投稿されたほうがいいかもしれません。
senma0011

2019/08/26 02:42

自己解決に至ることができました。助言していただきありがとうございました。
退会済みユーザー

退会済みユーザー

2019/08/28 02:07

ちなみに、何の書籍(講座)? 名称をいえないものの場合、そのコードも同様の扱いをしないといえない
senma0011

2019/08/28 07:00

学生向けのインターンシップです。
guest

回答1

0

自己解決することができました!

同じ質問への回答を参考にしました。
Notice: Undefined variableの解決方法
unset
break
html number

今後は削除した後の番号の振り直しを考えています。
array_values

php

1<html> 2<head> 3 4<?php 5 6mb_language("Japanese"); 7 mb_internal_encoding("UTF-8"); 8$err1=""; 9$err2=""; 10$err3=""; 11$OK_delete=""; 12$OK_message="";//初回のアクセス時には送信ボタンが押されていないため何も表示がないことをここに書き込んでおく 13 14if(isset($_POST['send']) === true){//送信ボタンが押された場合に以下のプログラムを働かせるためtrueを使う 15 16 17if($_POST['name'] === ""){ 18$err1= "名前を入力してください";//===は左右がまったく同じ値の場合の意、==でもいいがこちらは意図しない相互変換が行われてしまい1==1aaでもtrueになることもある 19}; 20 21if($_POST['message'] === ""){ 22$err2= "コメントを入力してください"; 23}; 24 25if( $err1 === "" && $err2 ==="" ){//&&はどちらもという意味andよりも厳格、どちらもエラーでなくメッセージが表示されないときにはこの下のプログラムが動くように設定 26$name=$_POST['name']; 27$message=($_POST['message']); 28$time=date("Y/m/d G:i:s");//時間取得 29 30$filename="mission_3-1.txt"; 31if (file_exists($filename)) { 32 $count = count(file($filename))+1;//file関数を使い行ごとに配列を格納し、その行の数をカウント 33} else { 34 $count = 1;//もし何も書き込まれていない場合は1を返す 35}; 36$newdata = (count(file($filename))+1)."<>".$name."<>".$message."<>".$time."<>".PHP_EOL;//php_eolの文字はfile型式に合わせた改行文字を打ってくれる 37//カウントした数に+1した値が次の投稿番号になる 38$filename="mission_3-1.txt"; 39$fp=fopen($filename,"a"); 40fwrite($fp,$newdata); 41fclose($fp); 42 43$OK_message=$newdata."を受け付けました";//  .をnewdataの後に置くことで並列表示ができる 44 45};}; 46 47$filename="mission_3-1.txt"; 48$delete=""; 49if(isset($_POST['send_delete']) === true){ 50$delete=$_POST['delete']; 51 52if($delete ===""){ 53 54 $err3="削除番号を入力してください"; 55}; 56if(!empty($delete)){ 57$file_num = file("mission_3-1.txt"); 58 59 foreach ($file_num as $value) { 60 $count_num = explode('<>', $value); 61if($delete>$count_num[0]){ 62 $err3="投稿番号が見つかりません"; 63break; 64}; 65}; 66}; 67 68 69if($err3===""){ 70 if (isset($_POST["delete"])){ 71 $delete = $_POST["delete"]; 72 if( get_magic_quotes_gpc() ) { $delete = stripslashes("$delete");} 73 $delete = htmlspecialchars ($delete);}; 74 75$file = file("mission_3-1.txt");//.txt情報を読込 76$cnt2 = 0; 77 78 foreach ($file as $value) { 79 $fileContent = explode('<>', $value); 80 81if($fileContent[0] == $delete){//削除したい番号と1つめのカラムが一致したら… 82 unset($file[$cnt2]);//一致した行を消す 83 84 file_put_contents("mission_3-1.txt",$file);//更新後の配列をfile_put_contentsで上書き 85 break; 86}; 87 $cnt2++; 88}; 89$OK_delete="削除しました"; 90}; 91 92 93 94}; 95 96 97 98 99?><h1>掲示板</h1> 100<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 101</head> 102<body> 103<form action="mission_3-3.php" method="post"> 104<h3>投稿</h3> 105 <p><input type="text" name="name" value="名前" size="10"></p> 106 <p><input type="text" name="message" value="コメント" size="20"></p> 107 <p><input type="submit"name="send" value="送信する"></p> 108<h3>投稿削除</h3> 109 <p><input type="tel" name="delete" value="削除番号" size="10"></p><!--削除番号の入力フォーム,input type telに変更、数字入力--> 110 <p><input type="submit"name="send_delete" value="送信する"></p> 111<?php 112echo $err1.'<br>'; 113echo $err2.'<br>'; 114echo $err3.'<br>'; 115echo $OK_delete.'<br>'; 116echo $OK_message.'<br>'; 117?> 118</form> 119<h2>表示欄</h2> 120 121<?php 122$file_name = "mission_3-1.txt"; 123$data = file_get_contents($file_name); 124$data=explode("<>",$data);//<>でデータを分割して配列に格納 125$cnt = count($data);//分割したデータをカウント 126for ($i=0; $i<$cnt; $i++)//カウント数以下なら1を足した数値の数を表示 127{ 128 echo ($data[$i])."<br>"; 129 130} 131?> 132</body> 133</html>

投稿2019/08/26 02:40

senma0011

総合スコア4

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

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

m.ts10806

2019/08/26 02:44

冗長なところがあったりXSS対策だったり抜けているところはありますが、 ひとまず第一段階としては良いと思います。 ※ただ入門編とはいえテキストベースでデータをやりとりすることってほとんどないので文字列操作の練習以外に役に立ちません。早々にデータベースにうつりましょう
退会済みユーザー

退会済みユーザー

2019/08/26 03:23

m.ts10806 おそらく書籍か講座で段階を踏んで作成する 簡易掲示板(ほんとよく見る) mission_3-1.txt や mission_3-3.txt mission_2-6.txt etc
m.ts10806

2019/08/26 03:26

asahina1979さん ええ、よく見ますから「多分同じ参考書使ってるんだろうな」と思ってます。 でもそういう参考書ってたいていPHPのバージョンも低いのであまり積極活用してほしくないなとは思います(今回の質問者はしっかりと調べてくれてるのでできれば抜け出してほしい)
senma0011

2019/08/28 01:23

文字数制限やhtmlの特殊文字をエスケープする方法などはいろいろと調べてみます!データベースも適宜学んでいく予定です! これからも頑張ります!お二方いろいろと教えてくださりありがとうございました。
m.ts10806

2019/08/28 01:32

PHPマニュアルを活用できるようになると自己解決できる機会も増えてきます。 がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問