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

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

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

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

Q&A

解決済

2回答

7339閲覧

投稿番号の取得について

takakuni

総合スコア19

PHP

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

0グッド

0クリップ

投稿2019/03/05 06:04

編集2019/03/09 05:00

前提・実現したいこと

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);

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

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

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

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

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

papinianus

2019/03/05 06:11

> 番号が表示されなくなってしまいました データが空っぽの状態から始めましたか?それともいくつかデータがある状態でコードを変えましたか?データがないときでは、1行目が存在しないので、1行目から番号を得る処理が動きません($numberが""になる) また、$numberはsubnumberに+1する必要があると思います。
guest

回答2

0

ベストアンサー

一応、前の回答に対応方法の案を書いています。

どちらかで対応されるものと思ってましたが・・・

  • 「何も書き込まない」のではなく「空を書き込む」
  • 「現在の最後の番号」を管理するデータを別途ファイルに持っておいて、そこから採番するように改修

投稿2019/03/05 06:12

m.ts10806

総合スコア80765

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

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

takakuni

2019/03/06 03:52

現在の最後のデータを別ファイルで持っておくやり方として、 ```php <?php $numData = 'lastNumber.txt'; if (file_exists($numData)) { $number = count(file($numData))+1; } else { $number = 1; } $fn = fopen($numData, 'a'); fwrite($fn, $number); fclose($fn); ?> ``` にしてみたのですが、投稿番号が2から増えないのはどのような問題点がありますか?
m.ts10806

2019/03/06 03:54

関数を重ねすぎなのは大問題。 デバッグと問題切り分けが困難になります。 ひとつひとつ分解して、一行一行結果を確認して着時に進めてください
takakuni

2019/03/08 05:01

別途ファイルで、改修することができました! ありがとうございました
m.ts10806

2019/03/08 06:51

解決されたようで何よりです。 最終的なコードを質問本文に追記された方が顛末がわかって後から参考にもしやすくなりますので
takakuni

2019/03/09 05:00

ありがとうございました!
guest

0

mts10806さんのコメントに対して
lastNumber.txt
のデータを確認してみたでしょうか
おそらく122222222
などになっている

php

1count(file($numData))

これだとfileの配列の数なので
array(1) { [0]=> string(3) "122" }
の配列は1なのでずっと2になります

php

1$number = file ($numData)[0] + 1;

などにしてみて下さい

php

1fopen($numData, 'a');

これだと追記になり1222222
となります

php

1fopen($numData, 'w');

として上書きして下さい。

投稿2019/03/06 04:19

date

総合スコア1820

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

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

takakuni

2019/03/06 04:28 編集

確認しました。 言われている通り、1222などとなっていて自分でもそこに関しては理解がつきました。 $number = file ($numData)[0] + 1; この部分なのですが、文法のエラーが出ているのですがどうすればいいですか、 あと、wモードは、ファイルを一回、空にするみたいな機能で僕は理解していたのですが、wでも大丈夫ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問