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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

8561閲覧

テキストファイルに投稿番号を記述する。

Ryotarox

総合スコア28

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/10/13 04:25

編集2018/10/13 06:00

前提・実現したいこと

HTMLで入力フォームを用意する。入力項目は「名前」と「コメント」とする
フォームからの入力値を新しいテキストファイルに保存する。
その際、1行ごとに「(投稿番号)<>(名前)<>(コメント)<>(投稿日時)」と言う形で保存する
(例: 1<>社団太郎<>これはテストです<>2017/10/20 0:00:00)
投稿番号は、最後の投稿番号に+1したものが入ること。ただし、1回目の投稿なら「1」とする。

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

投稿番号が全て「1」になってしまいます。できれば、投稿番号はテキストファイルに書かれた行の番号にしたいです。

該当のソースコード

PHP

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<title>mission2-1</title> 5</head> 6<body> 7 8 9 10 <form action = "mission_2-1.php" method="post"> 11 名前: 12 <input type="text" name="name"><br /> 13 14 コメント: 15 <input type="text" name="comment"><br /> 16 17 <input type="submit" value="送信" > 18 </form> 19 20 <?php 21 $filename = 'mission_2-1_syadan.txt'; #ここでテキストファイルに記述しています。 22 if(!empty($_POST["name"])) { 23 24 $fp = fopen($filename,'a'); 25 $dataFile = explode(" ",$filename) ; #ここがうまくいっていません! 26 fwrite($fp,count(file($dataFile[0]))."<>".$_POST["name"]."<>".$_POST["comment"]."<>".date( "Y年m月d日 H:i:s" )); 27 fwrite($fp,"\n"); 28 fclose($fp); 29 } 30 ?> 31 32 <?php 33#テキストファイルの内容をブラウザに表示させています。 34$fp = fopen('mission_2-1_syadan.txt', "r"); 35while ($line = fgets($fp)) { 36 $line2 = explode("<>",$line); 37 print_r($line2[0]." ".$line2[1]." ".$line2[2]." ".$line2[3]); 38 print_r("<br>"); 39} 40fclose($fp); 41 42?> 43 44</table> 45</body> 46</html> 47

試したこと

(count(file($dataFile)))のcountをsizeofにしてみたがうまくいかなかった。

###関数の実行

txt

11<>test<>test<>2018年10月12日 23:58:20 21<>test<>test<>2018年10月12日 23:58:32 31<>test<><>2018年10月12日 23:58:38 41<>test<>実験<>2018年10月12日 23:58:46 51<>リンゴ<>test<>2018年10月13日 12:52:09

期待される関数の実行

txt

11<>test<>test<>2018年10月12日 23:58:20 22<>test<>test<>2018年10月12日 23:58:32 33<>test<><>2018年10月12日 23:58:38 44<>test<>実験<>2018年10月12日 23:58:46 55<>リンゴ<>test<>2018年10月13日 12:52:09

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

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

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

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

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

m.ts10806

2018/10/13 04:29

explode()はどのような意図でいれてますか?「うまくいかない」では起きていることはわからないので具体的に起きていることを書いてください
Ryotarox

2018/10/13 04:35

count関数は配列の数を数えると認識していたので、explode関数でテキストファイルの中の文字を配列化しようとしました。
m.ts10806

2018/10/13 04:49

まとめて一気に実行すると問題の切り分けが難しくなるのでひとつひとつわけてされては?「確実にこうなる」という保証はどこにもないのでひとつひとつ正常確認していくと良いです。私も一気に複数実行することはないです。
Ryotarox

2018/10/13 04:51

わかりました。ファイルの中身を分けてみます。
m.ts10806

2018/10/13 04:52

ファイルの中身ではないです。関数の実行です。
guest

回答3

0

切り分けは、最小機能の物を作成して、変数の推移を追うのが定石です。
また、学習の初期の段階で、デバッグ環境を整えると学習速度が飛躍的に伸びるので試してみてください。

今回のケースでいうと、

php

1<?php 2$filename = 'mission_2-1_syadan.txt'; #ここでテキストファイルに記述しています。 3$dateFile = explode(" ",$filename) ; 4var_dump($dateFile);

あたりから始めるのがよいです。

debug 環境を構築できていれば、ブレークポイントを設定することで、var_dump() する必要はなくなります。

個人的には、fopen() は学習初期には理解しにくかったので、file()file_get_contents() を使用すると、理解しやすくなると思います。
*最終的には、必須な関数ではありますが。

投稿2018/10/13 04:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

自己解決

##解決策
(count(file($filename))+1)と変更すればうまく表示できました。
おそらくexplodeにしているせいで要素が1つになっていたので、ファイル名をそのまま入れるべきだったのだと思います。

php

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<title>mission2-1</title> 5</head> 6<body> 7 8 9 10 <form action = "mission_2-1-3.php" method="post"> 11 名前: 12 <input type="text" name="name"><br /> 13 14 コメント: 15 <input type="text" name="comment"><br /> 16 17 <input type="submit" value="送信" > 18 </form> 19 20 <?php //テキストに記述 21 $filename = 'mission_2-1_syadan.txt'; 22 if(!empty($_POST["name"])) { 23 24 $fp = fopen($filename,'a'); 25 fwrite($fp,(count(file($filename))+1)."<>".$_POST["name"]."<>".$_POST["comment"]."<>".date( "Y年m月d日 H:i:s" )); 26 fwrite($fp,"\n"); 27 fclose($fp); 28 } 29 ?> 30 31 <?php 32 //ブラウザに表示 33 $fp = fopen('mission_2-1_syadan.txt', "r"); 34 while ($line = fgets($fp)) { 35 $line2 = explode("<>",$line); 36 print_r($line2[0]." ".$line2[1]." ".$line2[2]." ".$line2[3]); 37 print_r("<br>"); 38} 39fclose($fp); 40 41?> 42 43</table> 44</body> 45</html> 46 47

投稿2018/10/13 09:11

Ryotarox

総合スコア28

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

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

退会済みユーザー

退会済みユーザー

2018/10/13 09:22

file() のマニュアルをちゃんと読んだほうがイイよ。
Ryotarox

2018/10/13 10:01

すみません。読んできます。
guest

0

$dateFileと$dataFileをtypoしていませんか?

追記

explodeの返り値は配列であることを注意してください。

PHP

1<?php 2$filename = 'mission_2-1_syadan.txt'; #ここでテキストファイルに記述しています。 3$dataFile = explode(" ",$filename); 4// echo($dataFile); ==> PHP Notice: Array to string conversion in /workspace/Main.php on line 5 5echo($dataFile[0]); // mission_2-1_syadan.txt 6?>

よって、ファイル名を参照する場合は添字を指定してください。たとえば次のようにです。

PHP

1count(file($dataFile[0]))

投稿2018/10/13 05:03

編集2018/10/13 05:21
takey

総合スコア312

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

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

Ryotarox

2018/10/13 05:07

確かに間違えてました。修正して実行してみます。
Ryotarox

2018/10/13 05:19

修正したら、エラーが生じました... Parse error: syntax error, unexpected T_STRING in /home/tt-566.99sv-coco.com/public_html/mission_2-1.php on line 30
takey

2018/10/13 05:23

追記しましたので、そちらを一度確認してみてください。
Ryotarox

2018/10/13 05:30

修正してみましたが、やはりエラー内容は変わりません。
takey

2018/10/13 05:43

$dataFile = explode(" ",$filename) ; #ここがうまくいっていません! ↑ #の直前、全角スペースが含まれていませんか?
Ryotarox

2018/10/13 05:58

含まれてました。修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問