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

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

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

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

Q&A

解決済

1回答

1433閲覧

PHP 掲示板 削除・編集を行った後の新規投稿の番号を最後の行+1としたい

allfree

総合スコア3

PHP

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

0グッド

1クリップ

投稿2020/08/15 08:24

編集2020/08/15 09:14

現在PHPを用いて、簡易掲示板を作成しています。
新規投稿・削除・編集・ログイン機能を備えた簡易掲示板を最終的に作成する事が目的で、ようやくログイン機能を追加し、完成かと思いきや、投稿内容を削除し、その後、新規投稿を行った後に投稿番号が最後の行と同じ番号となってしまったり、最後の投稿番号より若い番号になってしまったりします(編集による書き換えはできています)。
恐らく、投稿する時に最後の行+1として投稿されているのではなく、行数(例えば、19番目までの投稿があり、17と18を消したとしたら、全体の数は17なので、次は18となる)で投稿番号が決められている、定義されているのかなと思います。

そこで、削除機能を実装する時に使った下記のコードを if (empty($_POST['edit-number'])) {  のまとまりの後に書いてあげる事で対処できるはずと思ったのですが、そうすると編集ができなくなってしまいました。

 //削除機能を実装する際に用いたコード
if ( file_exists( $filename ) ) {
$lines=file($filename);
$lastline= $lines[count($lines) -1];
$number = explode('<>',$lastline)[0]+1;
} else { //ファイルが無かった場合変数の定義を1とする*/
$number = 1;
}

このコードを書き、 if (empty($_POST['edit-number'])) { のまとまりを消すと、編集ができなくなってしまいます(しかし、削除後に新規投稿を行うと最後の行+1という自分が求めていた形で表示されます)。

そもそも書き方が間違っているのか、他にも編集のための if (empty($_POST['edit-number'])) { のかたまりを消さないで、削除した後の新規投稿を+1した形で表示できるようなコードの書き方があるのでしょうか?

調べてみたのですが、問題解決には至りませんでしたので、最終的に頼らせていただくことにしました。

どなたか解決できる方、できれば具体的なコードを書いて頂いて、回答していただけると幸いです。
よろしくお願いいたします。

解決していただきたい事:削除・編集した後に新規投稿を行い、その投稿番号が最後の投稿番号+1をした形でとうこうされるようになる

php

1 2//以下は現在のソースコード 3 4<!DOCTYPE html> 5<html lang="ja"> 6<head> 7<meta charset="UTF-8"> 8</head> 9<body> 10 11 12<?php 13 $filename = "keiziban.txt"; 14 15 16 //新規投稿機能 17if (!empty($_POST['name']) && !empty($_POST['comment']) && !empty($_POST['passcode'])) { 18 19 $name = $_POST['name']; 20 $comment = $_POST['comment']; 21 $date = date("Y年m月d日 H時i分s秒"); 22 $password=$_POST['passcode']; 23 24 25 //編集対象番号が入力されているなら 26 if (empty($_POST['edit-number'])) { 27 //ファイルの存在がある場合は投稿番号+1、なかったら1を指定する 28 if (file_exists($filename)) { 29 $number = count(file($filename)) + 1; 30 } else { 31 $number = 1; 32 } 33 34 35 36 $list = $number . "<>" . $name . "<>" . $comment . "<>" . $date."<>".$password."<>"; //投稿内容 37 38 39 //ファイルを追記保存モードで開く 40 $fp = fopen($filename,"a"); 41 fwrite($fp,$list . "\n"); 42 fclose($fp); 43 44 45 46 47 //編集実行機能 つまり新規投稿と編集で分岐する 48 }else{ 49 50 $edit_number = $_POST['edit-number']; //読み込んだファイルの中身を配列に格納する 51 $ret_array = file($filename); 52 $fp = fopen($filename,"w"); //ファイルを開き、中身を空に 53 54 foreach ($ret_array as $line) { //配列の数だけループ 55 $edit_date= explode("<>",$line); 56 57 //新稿番号と編集番号が一致・不一致で分ける 58 if ($edit_date[0] == $edit_number) { 59 60 //編集のフォームで送信された値で上書きする($edit_numberが$numberと変わっている) 61 fwrite($fp, $edit_number. "<>" . $name . "<>" . $comment . "<>" . $date . "\n"); 62 63 64 } else { 65 fwrite($fp,$line); //不一致なら書き込む 66 } 67 } 68 fclose($fp); 69 70 } 71 } 72 73 74 75 //削除機能 76if(!empty($_POST['deleteNo']) && !empty($_POST['Delpasscode'])){ //DelpasswordがPOSTされていないなら、機能しない 77 78 79 $Delpassword=$_POST['Delpasscode'] ; 80 $delete=$_POST['deleteNo']; //$deleteの定義づけ 81 $delcon=file("keiziban.txt"); //file関数で開くテキストファイルの指定 82 $fp=fopen("keiziban.txt","w");//ファイル読み込み、中身を空にする 83 84 85 for($j=0; $j<count($delcon); $j++){ //ループ処理を行う 86 $deldata=explode("<>",$delcon[$j]); //カッコで抽出 87 88 89 if($deldata[0] != $delete){ //削除番号と行番号が一致・不一致 90 fwrite($fp,$delcon[$j]); //行内容をファイルに書き込む 91 92 }else{ 93 fwrite($fp, ""); //書き込まない(つまり削除)、行を詰める 94 } 95 } 96 97 fclose($fp); //ファイルを閉じる 98} 99 100 101 102 103 //編集選択機能 104if (!empty($_POST['edit']) &&!empty($_POST['Editpasscode'])) { 105 106 //入力データの受け取りを変数に代入 107 $Editpassword= $_POST['Editpasscode']; 108 $edit = $_POST['edit']; 109 110 //読み込んだファイルの中身を配列に格納する 111 $editCon = file($filename); 112 113 foreach ($editCon as $line) { 114 $editdata = explode("<>",$line); 115 116 //投稿番号と編集対象番号が一致したらその投稿の「名前」と「コメント」を取得 117 if ($edit == $editdata[0]) { 118 119 //投稿のそれぞれの値を取得し変数に代入 120 $editnumber = $editdata[0]; 121 $editname = $editdata[1]; 122 $editcomment = $editdata[2]; 123 124 //既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる 125 //formのvalue属性で対応 126 } 127 } 128} 129?> 130 131 132 133 134<form action="keiziban.php" method="post"> 135<input type="text" name="name" placeholder="名前" value="<?php if(isset($editname)) {echo $editname;} ?>"><br> 136<input type="text" name="comment" placeholder="コメント" value="<?php if(isset($editcomment)) {echo $editcomment;} ?>"> 137<input type="hidden" name="edit-number" value="<?php if(isset($editnumber)) {echo $editnumber;} ?>"> 138<input id="password" type="password" name="passcode" value="<?php if(isset($editpassword)) {echo $editpassword;} ?>" placeholder="パスワードを入力してください"> 139<input type="submit" name="submit" value="送信"> 140</form> 141 142 143<form action="keiziban.php" method="post"> 144<input type="text" name="deleteNo" placeholder="削除対象番号"> 145<input id="password" type="password" name="Delpasscode" value="" placeholder="パスワードを入力してください"> 146<input type="submit" name="delete" value="削除"> 147</form> 148 149<form action="keiziban.php" method="post"> 150<input type="text" name="edit" placeholder="編集対象番号"> 151<input id="password" type="password" name="Editpasscode" value="" placeholder="パスワードを入力してください"> 152<input type="submit" value="編集"> 153</form> 154 155 156 157<?php 158 159 160 //表示機能 161 $filename = "keiziban.txt"; 162 if (file_exists($filename)) { 163 $array = file($filename); //読み込んだファイルの中身を配列に格納する 164 165 166 foreach ($array as $word) { //取得したファイルデータを全てループ処理で表示する 167 $getdata = explode("<>",$word); //explode関数でそれぞれの値を取得 168 echo $getdata[0] . " " . $getdata[1] . " " . $getdata[2] . " " . $getdata[3] . $getdata[4] . " " ."<br>"; //取得した値を表示する 169 } 170 } 171 172 173?> 174 175 </body> 176</html>

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

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

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

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

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

m.ts10806

2020/08/15 08:59

コードブロックにはコードだけいれてください。
allfree

2020/08/15 09:16

初投稿でして、不注意でした。 申し訳ありません。 編集完了しましたので、ご回答の方をしていただければと思います!
guest

回答1

0

ベストアンサー

これまで何度となく簡易掲示板ネタに絡んできて何度も回答でお伝えしていることなのですが、
例えば、1,2,3,4,5と投稿があるときに4を削除すると
物理削除(レコードをまるっと削除してしまうこと)をすると1,2,3,5になりますよね。
その状態では、行数は4なので、4+1の5を投稿番号に使ってしまうのでしょうけど、
すでに5はデータファイル上に存在します。
だから、そういうやり方は間違っています。

解決策として主に2つお伝えしてきていて、

1)
データファイル上の投稿番号を逐一チェックして、
既存の投稿番号の最大値を調べた上で+1して使う。

2)
別途投稿番号管理用ファイルを設けて、
投稿があるたびに+1した内容に更新するようにする。

といったやり方があります。

1)の方式を例示すると、こんな感じでしょうか。

php

1 //ファイルの存在がある場合は投稿番号+1、なかったら1を指定する 2 if (file_exists($filename)) { 3 $data = file($filename); 4 $max = 0; 5 foreach ($data as $line) { 6 list($number, $name, $comment, $timestamp, $password) = explode("<>", $line); 7 if (intval($number) > $max) { 8 $max = intval($number); 9 } 10 } 11 $number = $max + 1; 12 } else { 13 $number = 1; 14 } 15

投稿2020/08/15 14:08

編集2020/08/15 14:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

allfree

2020/08/16 01:07

m6u様 ご回答いただきありがとうございました。返信が遅くなってしまい、大変申し訳ありません。 実行してみた所、新規投稿・削除・編集も変わらず実行され、私が求めていました削除・編集した後の新規投稿の番号が最後の行+1されるようになると言う事も実行され、無事に解決いたしました。 本当にありがとうございました! また、縁がありましたら、その時はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問