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

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

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

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

Q&A

解決済

1回答

600閲覧

テキストファイルの行数を追記されるごとにカウントし、そのテキストファイルの先頭に追記順に番号を各行の先頭に書きたい

1721155

総合スコア7

PHP

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

0グッド

0クリップ

投稿2017/08/23 08:28

編集2017/08/23 08:44

###前提・実現したいこと
PHPのかなりの初心者です。初心者でもわかるように答えていただけると幸いです。
現在、初心者レベルの掲示板作成に取り組んでいます。

実現したいこと)
作成した掲示板の投稿内容をテキストファイルに追記するコードを書いています。
そのファイルを例えば、'abc.txt'という名前にします。
このファイルには、追記されるごとに以下のような文字列が記述されるとします。

名前1,コメント1
名前2,コメント2
名前3,コメント3


ここで、私が実現したいことは、追記されていく各行をカウントし、
そのカウントを投稿番号としてabc.txtファイルの各行の先頭に埋め込みたいのです。

意味が伝わるとありがたいのですが、
簡潔に言うと、
掲示板の投稿内容とその投稿順の番号を、同一テキストファイルに1行で書き、投稿が増えるごとに番号も加算されてテキストファイルに書き込まれるようなコードを書きたいです。

皆様ならどうやるのか具体的なコードで教えていただきたいです。
初心者でも調べやすい、関数や記述で教えていただけると幸いです。

よろしくお願いいたします。

以下のようなコードを現在書いています。
追記自体はうまくいっており、あとは投稿番号を振れればと考えています。

###ソースコード

<?php $err_msg1 = ""; $err_msg2 = ""; $message = ""; $name = (isset($_POST["name"]) === true) ?$_POST["name"]: ""; $comment = (isset($_POST["comment"]) === true) ?trim($_POST["comment"]):""; $date = date("Y-m-d H:i:s"); $num = 0; if(isset($_POST["send"]) === true){ if($name === "") $err_msg1 = "名前を入力してください"; if($comment === "") $err_msg2 = "コメントを入力してください"; if($err_msg1 === "" && $err_msg2 === ""){ $file = "abc.txt"; $fp = fopen($file, "ab"); fwrite($fp, $num . '<>' . $_POST["name"] . '<>' . $_POST["comment"] . '<>' . $date. "\n"); fclose($fp); $message = "書き込みに成功しました"; } } $fp_r = fopen($file,"r"); $dataArr= array(); while( $res = fgets($fp_r)){ $tmp = explode("<>",$res); $arr = array( $num => $tmp[0], "name" => $tmp[1], "comment" => $tmp[2], $date => $tmp[3] ); $dataArr[]= $arr; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>掲示板</title> </head> <body> <?php echo $message; ?> <form method="post" action=""> 名前:<input type="text" name="name" value="<?php echo $name; ?>" > <?php echo $err_msg1; ?><br> コメント:<textarea name="comment" rows="4" cols="40"><?php echo $comment; ?></textarea> <?php echo $err_msg2; ?><br> <br> <input type="submit" name="send" value="送信" > </form> <dl> <?php foreach( $dataArr as $arr ):?> <p><span><?php echo $count; ?></span>:<span><?php echo $arr["name"]; ?></span>:<span><?php echo $arr["comment"]; ?></span></p> <?php endforeach;?> </dl> </body> </html

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

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

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

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

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

m.ts10806

2017/08/23 08:32 編集

初心者というのを質問タイトルや本文に書くのではなく質問投稿画面のタイトル横にある初心者アイコンをご利用ください。また、できれば途中で結構ですので、自身が作ってみたソースコードもご提示ください。
guest

回答1

0

ベストアンサー

考え方としては、追記をする前に現在どれだけデータが存在するかを確認し、追記するタイミングでIDを追加するという形が楽かと思います。
(データの削除はされ無いという前提)

現状では

PHP

1$file = "abc.txt"; 2$fp = fopen($file, "ab"); 3fwrite($fp, $num . '<>' . $_POST["name"] . '<>' . $_POST["comment"] . '<>' . $date. "\n"); 4fclose($fp); 5 6$message = "書き込みに成功しました"; 7

ここで書き込みを行っているのですが、ここではデータがどれくらいあるかを確認する前なので、次に振るべきIDがわかりません。

少し後の

PHP

1$fp_r = fopen($file,"r"); 2 3$dataArr= array(); 4while( $res = fgets($fp_r)){ 5$tmp = explode("<>",$res); 6$arr = array( 7$num => $tmp[0], 8"name" => $tmp[1], 9"comment" => $tmp[2], 10$date => $tmp[3] 11); 12$dataArr[]= $arr; 13}

この辺でファイルの行をすべて配列に格納しているので、
これより後であれば

PHP

1count($dataArr);

のような感じでデータの数を数えることが出来ます。

ということで、現状のソースに手っ取り早くIDの追記を実装するとすれば

  1. 追記前にファイルを配列に読み込む処理を加える
  2. 配列の数を数えてIDを取得して、追記する
  3. 再度ファイルを読み直す

という感じかなと思います。
この場合、1と3で殆ど同じ処理を行うことになって無駄なので、うまくいった後に修正を試みてみるのも勉強になるかと思います。

投稿2017/08/23 13:30

tanat

総合スコア18713

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

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

1721155

2017/08/23 13:57

ありがとうございます。 正直まだ、配列に関するイメージがついていないため、1.ができるか怪しいです。 勉強も含め頑張ってみます。 また、詳しく伺うかもしれません。その折は、よろしくお願いいたします。
tanat

2017/08/23 14:16

1は今ファイルを読み込んでいる部分でやっているところなので、 今できている部分を一つづつ見直してみると理解が深まると思いますよ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問