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

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

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

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

Q&A

解決済

1回答

607閲覧

最初2つの投稿番号だけ1が連続してしまいます

kyrie

総合スコア11

PHP

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

0グッド

0クリップ

投稿2021/01/18 18:11

編集2021/01/18 18:51

HTMLとPHPで投稿フォームを作り、送信/受信を行う簡単なサイトを作っています。投稿順に応じて投稿番号が記載されるようにしたいのですが、最初の2投稿だけ番号が1になってしまいます。
(その後は2,3,4,,,とちゃんと増えていく)
コードは以下の通りです。

PHP

1<html lang="ja"> 2 <head> 3 <meta charset="UTF-8"> 4 <title>mission_1-21</title> 5 </head> 6 <body> 7 <!-HTMLとPHPで投稿フォームを作り、送信/受信を行う-> 8 <form action="" method="post"> 9 <input type="text" name="name" placeholder="名前"> 10 <input type="text" name="com" placeholder="コメント"> 11 <input type="submit" name="submit"> 12 <br> 13 <input type="number" name="del" placeholder="削除依頼番号"> 14 <input type="submit" name="削除"> 15 </form> 16 <?php 17 $name = $_POST["name"]; 18 $com = $_POST["com"]; 19 $date = date ( "Y年m月d日 H時i分s秒" ); 20 $filename="mission_3-3.txt"; 21 $num = 1; 22 $num = count(file($filename));//投稿番号の取得 23 $del = $_POST["del"];//削除番号の追加格納 24 25 ///////////////////////////////////確認 26 echo "============================"."<br>"; 27 echo "【確認】<br>"; 28 29 echo "今のnumは".$num."<br>"; 30 echo is_numeric($num)."<br>"; 31 echo $del."<br>"; 32 echo "comは".is_string($com)."<br>"; 33 34 echo "============================"."<br>"; 35 /////////////////////////////////// 36 37 if($com==""){}elseif(is_string($com)==1){ 38 $FP = fopen($filename,"a"); 39 fwrite($FP,$num."<>".$name."<>".$com."<>".$date.PHP_EOL); 40 fclose($FP); 41 } 42 43 if(file_exists($filename)){ 44 $toukous = file($filename,FILE_IGNORE_NEW_LINES); 45 } 46 47 foreach ($toukous as $toukou) { 48 $array = explode('<>', $toukou); 49 $N=count($array); 50 if($array[0]!=$del){ 51 for($i=0; $i<=$N-1; $i++){ 52 echo $array[$i]." "; 53 } 54 } 55 echo "<br>"; 56 } 57 58 ?> 59 60 </body> 61 </html>

【確認】の部分でその時々の投稿番号が、テキストファイルに書き込まれる前でどう定義されているのかを確認しています。
それによると、$numが投稿を送るごとに
1,1,2,3,4,・・・・
と動くので、
おそらく
【最初の投稿】
ファイルが空っぽでも、$num = count(file($filename));でなぜか1行目だけ認識されている
【2回目の投稿】
ファイルに1行しかないので$num = count(file($filename));で1が認識
【3回目】
ファイルに2行あるので$num = count(file($filename));で次の投稿番号が2



といった流れなのではないかの考えます。

とはいっても解決方法がわからないのですが。。。

どなたか解決法を教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、 $num は 既存の投稿数を設定しているので 0,1,2,3... となります。
つまり、投稿を追加する前に +1 するです。

また、最初はファイルが無いと仮定しますと、file() で false が返され
count() で勘定できないものが指定されると 1 が返されます。
なので、ファイルが無かった場合は $num に 1 を設定する処理を記述します。

ということで、現状は 1,1,2,3... となっている、てわけです。
--- 追記 ---
例えばこんな感じで現在の投稿数を得るのがわかりやすいと思います。

php

1if (file_exists($filename)) { 2 $num = count(file($filename)); 3} else { 4 $num = 0; 5}

投稿2021/01/18 21:13

編集2021/01/19 11:17
takasima20

総合スコア7460

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

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

kyrie

2021/01/19 07:17 編集

回答ありがとうございます。 理解が深まりました。 初期値でファイルがない場合は $num = count(file($filename)); が勝手に1になってしまうということですが、これをちゃんと0と認識させるためにはどうすれば良いのでしょうか。
kyrie

2021/01/19 11:56

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問