前提・実現したいこと
phpの簡易掲示板を作成しています
投稿番号の取得について質問です。
削除機能を実装中に以下の不具合が発生しました。
発生している不具合
削除機能を使うと、その後の投稿番号に重複が生じています。
例
1 名前 コメント
2 名前 コメント
3 名前 コメント
2番を削除
1 名前 コメント
3 名前 コメント
投稿
1 名前 コメント
3 名前 コメント
3 名前 コメンと
該当のソースコード
php
1if (file_exists($filename)) { 2 $number = count(file($filename))+1; 3 } else { 4 $number = 1; 5 } // ファイルがあれば、番号は+1した値を代入、なかったら、番号は1 6 7 $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n";
試したこと
多分ですが、count関数に投稿番号が依存しているのではと思い
次のことを試しました
php
1$lines = file($filename); // 配列化 2$lastLine = $lines[count($lines)-1]; //最終行の配列の値まで来ている 3$subnumber = explode('<>',$lastLine); // その値を分割する 4$number = $subnumber[0]; // 投稿番号を取得 5 6$datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n";
補足として全体
php
1<?php 2 $filename = '〇.txt'; // 変数filenameを宣言 3 ini_set('display_errors', "On"); //エラー表示の出力 4 function h($s) { 5 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); //phpの文字化け対策 6 }; 7 8 if ($_SERVER['REQUEST_METHOD'] == 'POST') { 9 $value = $_POST['mode']; 10 switch( $value ){ 11 case "insert": 12 $name = $_POST['name']; 13 $comment = $_POST['comment']; 14 $time = date('Y年m月d日 H時i分s秒'); 15 $lines = file($filename); 16 $lastLine = $lines[count($lines)-1]; //最終行の配列の値まで来ている 17 $subnumber = explode('<>',$lastLine); 18 $number = $subnumber[0]; 19 20 $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n"; 21 $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入 22 fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入 23 fclose($fp); // 変数をfpを閉じた。 24 break; 25 case "delete": 26 $delete = $_POST["delete"]; // 変数deleteを宣言して投稿されたdeleteを代入する 27 $delCon = file($filename); // delConを宣言する。変数のfilenameを配列化して代入 28 $fp = fopen($filename, "w"); //php内で変数fpを宣言してファイルを作成、書き込みモードで開く 29 for ($j = 0; $j < count($delCon); $j++) { // ループの初期化、変数delConの要素数より少ない分ループを行う。行った後はループを1足す。 30 $delData = explode("<>", $delCon[$j]);// コメントデータ$j行目を1つ取り出した情報を<>で分割した上で変数delDataに格納 31 if ($delData[0] != $delete) { //コメントデータの最初は「コメント番号」なのでそれと入力された対象番号を比較、同じではない場合 32 fwrite($fp, $delCon[$j]); //一致しないので削除対象ではないとして書き込み 33 } else { 34 } 35 } 36 fclose($fp); 37 break; 38 } 39 } 40?> 41<!DOCTYPE html> 42<html lang="ja"> 43 <head> 44 <meta charset="utf-8"> 45 <title>〇</title> 46 </head> 47 <body> 48 <form action="" method="post"> 49 名前: <input type="text" name="name"> 50 コメント: <input type="text" name="comment"> 51 <button type="submit" name="mode" value="insert">登録する</button> 52 53 削除対象番号:<input type="text" name="delete"> 54 <button type="submit" name="mode" value="delete">削除する</button> 55 </form> 56 57 <?php 58 if (file_exists($filename)) { 59 $datalists = file($filename); 60 foreach ($datalists as $value) { 61 list($number, $name, $comment, $time) = explode("<>", $value); 62 echo h($number); 63 echo h($name); 64 echo h($comment); 65 echo h($time); 66 echo nl2br("\n"); 67 } 68 }else{ 69 echo "コメントが1件もありません"; 70 } 71 72 ?> 73 </body> 74</html> 75
ちなみにこのコードだと、番号が表示されなくなってしまいました。
よろしくお願いいたします
最終的な解決策
別のテキストファルに最新の投稿番号の数値だけ保存する方法
$fp2 = fopen('count_file.txt','r'); $num_text = fgets($fp2); fclose($fp2); $number = (int)$num_text; $number += 1; $fp2 = fopen('count_file.txt','w'); fwrite($fp2, $number); fclose($fp2);
回答2件
あなたの回答
tips
プレビュー