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

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

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

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

Q&A

解決済

2回答

1912閲覧

PHP 投稿番号を正確に1ずつ増やして保存したい

skrk44

総合スコア1

PHP

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

0グッド

0クリップ

投稿2020/08/13 11:20

編集2020/08/13 11:22

前提・実現したいこと

投稿番号を1から順に+1ずつしてテキストファイルに保存したい

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

最初はうまく保存されていたが、一度テキストファイルを消去してもう一度実行したら投稿番号が永遠に「2」でしか保存されなくなってしまった

該当のソースコード

PHP

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>mission_3-1</title> 6</head> 7<body> 8 <form action="" method="post"> 9 <label for="name">名前  </label> 10 <input type="text" name="name" placeholder="名前"> 11 <br> 12 <label>コメント</label> 13 <input type="text" name="comment" placeholder="コメント"> 14 <input type="submit" name="submit"> 15 </form> 16 17 <?php 18 $name = $_POST["name"]; 19 $comment = $_POST["comment"]; 20 $date = date("Y/m/d/ H:i:s"); 21 $num = count(file($filename))+1; 22 $filename = "mission_3-1.txt"; 23 24 if(!empty($comment) && !empty($name)){ 25 $fp = fopen($filename,"a"); 26 fwrite($fp,$num."<>".$name."<>".$comment."<>".$date.PHP_EOL); 27 fclose($fp); 28 29 $lines = file($filename,FILE_IGNORE_NEW_LINES); 30 foreach($lines as $line){ 31 echo $line . "<br>"; 32 } 33 } 34 ?> 35</body> 36</html>

試したこと

何度もテキスとファイルを消去した。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

te2jiさんの回答をそのまま支持しますが、
この手の簡易掲示板で1行ごとに投稿番号を持たせるとき、
のちに投稿の削除をどう実装するかによっては、
行数+1で次の投稿番号を生成するのは悪手ですよと警告いたします。

ファイル上に1,2,3,4,5があるときに4を削除するのに行まるごと削除して書き出す(物理削除)と、
1,2,3,5になりますよね、
行数+1の値は5になりますが、5が重複することになります。
そのため、物理削除を用いるときはデータファイル上の投稿番号を1行ずつ点検して、
最大の投稿番号+1を調べてから使う、という方法も検討しないといけません。

投稿削除時に論理削除(削除フラグを設けて、削除済みなら読み飛ばすやり方)するなら、
行数が狂うことはありませんが、
ファイル上に削除データもずっと残ってしまうことになります。

投稿番号が飛んでも良ければ、
別途投稿番号発番用管理ファイルを設けて
発番したら+1した値で管理ファイルを更新しておく
(もちろんファイルアクセス時は排他ロックをかける)
などとすれば、
間違いなく番号の重複を避けることができます。

投稿2020/08/13 13:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

skrk44

2020/08/14 09:02

ありがとうございます! なるほどですね、参考にさせていただきます!
guest

0

ベストアンサー

これ、Notice が出てません?

count(file($filename))+1;
を $num として採用しています。

が、この時点では$filenameは定義されていません。
つまり、file($filename)は false です。

なので、count() の以下の仕様通り 1 が返っています。

返り値

array_or_countable に含まれる要素の数を返します。 もしパラメータが配列でもなく Countable インターフェイスを 実装したオブジェクトでもない場合、1 が返されます。 ひとつ例外があり、array_or_countable が NULL の場合、 0 が返されます。

つまり、$num が 2 ですね。

投稿2020/08/13 12:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

skrk44

2020/08/14 09:00

ありがとうございます、ベストアンサーにさせていただきます! $filenameを上に持ってくることで2の連続は解消されました! しかし、次は「2,2,3,4...」と保存・表示されるようになってしまいました。。。
退会済みユーザー

退会済みユーザー

2020/08/14 09:12

同じですよ。 ファイルがないときに、file($filename) が false だからです。 デバッグ環境を整えて、変数の変化を追えるようにすると、学習がはかどります。 ぜひ、ステップ実行できる環境を手に入れてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問