PHPで掲示板を作ろう! 掲示板の作成方法 その4(ファイル読み込みとHTML表示)
今回でラストです。(次回はまとめをやる予定ですが。)
これだけのソースにしては説明が長かったですね。
結局はファイル(外部装置)の読み書きと配列への格納、HTMLへの表示ですね。
これは超基本ではありますが、プログラマの場合、毎日やりますね。
Contents
前回までの続き
その3 PHPで掲示板を作ろう! 掲示板の作成方法 その3(エラーチェックとファイル書き込み)
掲示板全体のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php //var_dump($_POST); //最初に変数を定義しておかないとエラーになる $err_msg1 = ""; $err_msg2 = ""; $message =""; $name = ( isset( $_POST["name"] ) === true ) ?$_POST["name"]: ""; $comment = ( isset( $_POST["comment"] ) === true ) ? trim($_POST["comment"]) : ""; //投稿がある場合のみ処理を行う if ( isset($_POST["send"] ) === true ) { if ( $name === "" ) $err_msg1 = "名前を入力してください"; if ( $comment === "" ) $err_msg2 = "コメントを入力してください"; if( $err_msg1 === "" && $err_msg2 ==="" ){ $fp = fopen( "data.txt" ,"a" ); fwrite( $fp , $name."\t".$comment."\n"); $message ="書き込みに成功しました。"; } } $fp = fopen("data.txt","r"); $dataArr= array(); while( $res = fgets( $fp)){ $tmp = explode("\t",$res); $arr = array( "name"=>$tmp[0], "comment"=>$tmp[1] ); $dataArr[]= $arr; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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 $data ):?> <p><span><?php echo $data["name"]; ?></span>:<span><?php echo $data["comment"]; ?></span></p> <?php endforeach;?> </dl> </body> </html> |
講義
今回で一応ラストですね。今回は
前回やったテキストファイルへの書き込みに加え、
- テキストファイルの読み込みと配列への格納
- HTMLへの表示
を学習します。
テキストファイルの読み込みと配列への格納
ソース
1 2 3 4 5 6 7 8 9 10 11 |
$fp = fopen("data.txt","r"); $dataArr= array(); while( $res = fgets( $fp)){ $tmp = explode("\t",$res); $arr = array( "name"=>$tmp[0], "comment"=>$tmp[1] ); $dataArr[]= $arr; } |
解説
テキストファイル読み込み
今回は実際にテキストファイルからデータを読み込む処理を行います。
まず前回の書き込み同様、しおり(ファイルポインタ)を取り出します。今回は書き込み系の処理ではなく読み込みなので、モードは”r”になります。
$fp = fopen(“data.txt”,”r”);
前回はfwirteという関数で書き込みを行いますが、今回は読み込みの処理を行いますので、fgetsという関数を使います。
この関数はファイルポインタを読み込み、1行分だけ読み込むという処理を行います。ポインタは1行分次にすすみます。
その結果が$resという変数に入ります。
たとえばテキストファイルの内容が
松本 テストです。
鈴木 テストです。
田中 テストです。
となっている場合、$resには一番先頭の「松本 テストです。」のみが取得されます。
配列への格納
次にテキストファイルから文字を取得したらこれを配列にいれます。
$resには今「松本 テストです。」という情報が入っています。
これをまず1行ではなく、名前=>”松本”,コメント=>”テストです。”といったように分割して、名前をつけた配列にいれてあげなくてはいけません。
分割
まず、分割ですが、それをおこなっているのが、
$tmp = explode(“\t”,$res);になります。
この処理は$resという文字列を\t(タブ)で区切り、配列にします、という処理です。
$tmpというのは普通の変数ではなく、配列で、0番目に”松本”,1番目に”テストです。”が入ります。
名前付け
このままでもよいのですが、0,1ではあとで処理をするときにわかりにくいのでラベルがついた配列にします。ようは連想配列にするわけですね。
その処理をおこなっているのが、
1 2 3 4 |
$arr = array( "name"=>$tmp[0], "comment"=>$tmp[1] ); |
でこれは
$tmpという配列から
“name”=>”松本”,”comment”=>”テストです。”という連想配列にしてます。
多次元配列への格納
ここまでの処理でnameとcommentを格納した配列を作成することはできましたが、ここまでだと1人分のデータしか格納できません。
掲示板の書き込みは1つではなく、通常多数であることが一般的です。
そのため多次元配列に格納する必要がでてきます。
その処理が$dataArr[]= $arr;になるんですね。
これは“name”=>”松本”,”comment”=>”テストです。”という連想配列を多次元配列に値を入れておくことを意味しています。
繰り返し
あとはこの処理をテキストファイルの行数文繰り返せばOKです。
今回の処理は全てwhileの中にあると思いますが、書き込みが3行なので3回この処理を行います。
ちなみにここまでのところが不安な方はそれぞれ以下のリンクで復習をしておきましょう。
HTMLへの表示
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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 $data ):?> <p><span><?php echo $data["name"]; ?></span>:<span><?php echo $data["comment"]; ?></span></p> <?php endforeach;?> </dl> </body> </html> |
解説
さて、がんばって配列に値を格納した後は今度はそれを表示しないといけません。
ここまでの処理はすべてPHPが内部でやっていることであり、人間にはその処理が一切わかりません。
人間が判定できるようになるためには画面に表示する必要がでてきます。
その処理が
1 2 3 |
<?php foreach( $dataArr as $data ):?> <p><span><?php echo $data["name"]; ?></span>:<span><?php echo $data["comment"]; ?></span></p> <?php endforeach;?> |
になります。これは$dataArrという多次元配列の中にデータが全てつまっているため、これをforeachでループ表示させます。
純粋なPHPで記述すると
1 2 3 4 5 6 7 |
<?php foreach( $dataArr as $data){ echo "<p>"; echo "<span>" . $data['name'] . "</span>"; echo "<span>" . $data['comment'] . "</span>"; echo "</p>"; } |
なのですが、上記はPHPをHTMLの中に組み込んでいますので、少し独特な書き方になっています。
ここらへんのループ処理が弱い方は
で復習しておきましょう。
まとめ
テキストファイルのよみこみと配列への格納
外部装置(今回はテキストファイル)からの読み込みと配列への格納というのはプログラミングの中でも最重要内容です。
プログラミングって極論すると配列の操作、処理
と今後やるオブジェクト指向が2大テーマなんですよね。
これはプログラミング言語が変わっても同じだと思います。
初心者にとっての鬼門がこの配列の操作、処理になります。
そういった意味でここは復習が超大事になってきます。しっかりと復習しておきましょう。
HTMLへの表示
ここは慣れないと意外と難しいところですね。
PHPで一番出てくる関数はforeachなので、この配列の処理になれていない方は何度も復習してみてください。
以上、掲示板の処理を一通り、ざっと見てきました。
あとは似たような処理を何度も繰り返して、体にしみこませるようにしましょう。
プログラミングは理解が半分、慣れが半分です。
次回の学習コンテンツは「PHPで掲示板を作ろう! 掲示板の作成方法 まとめ」になります。
関連記事
-
PHPで掲示板を作ろう!(データベース編) その2 MySQLログイン編
あ、最近はこのブログの画像に凝るようにしています。サイドバーなんかみていただくとブログのアイキャッチ
-
Java/PHP/Perl/Ruby/Python 主要Web系言語徹底比較
本日はWeb系で使われているプログラミング言語の比較をしてみようと思います。 Web系で使われ
-
就活生必見! Webエンジニアになるなら知っておきたい超基本業界用語
本日はWEB業界でよくつかわれる専門用語について私の知っている範囲で書いていこうと思います。
-
どんなプログラマが身につけておいても損はない重要なスキルとは?
のっけからストレートなタイトルですいません。 ちょっとあおり気味なタイトルですが、今日紹介する
-
PHPで掲示板を作ろう!(データベース編) その5 PHP-MySQL連結編
今回はMySQLの第5回目の講義です。 前回までの記事 PHPで掲示板を作ろう!(データベース編
-
「初級」〜「中級」のPHPエンジニアのスキルについてまとめてみる
いままで主にPHP(を中心としたWeb技術)を勉強し始めの傾けに記事を書いていましたが、今回は初級か
-
PHPで掲示板を作ろう!(データベース編) その6 まとめ編
今回はMySQLの第6回目の講義です。今回で終わりですので、ソースの説明と今までの解説の概略を書いて
-
初心者が知っておくべきプログラミングの学習法
おはようございます。松本です。 最近、体重が増えているのが悩みでして今現在71kgあります。去
Comment
自分はPHP初心者で、このwebページのソースをそのままコピー&ペーストをしてみたところ、書き込みがあった際に1人分のコメントしか表示されないというバグがあったのですが、色々試行錯誤した結果、18行目の
fwrite( $fp , $name.”\t”.$comment);
この部分の$commentの後に\nで改行を入れたところ解決いたしました。
しかし、今度は何も入力のない状態でそのページを開いたところエラーが発生してしまったため、現在も格闘中です。
解決策はまだわかっていませんが一応の報告です。
ひげさん
はじめまして。
管理人のmatsumotoです。
ご指摘ありがとうございます。
改行が抜けていることに気づきませんでした(汗)
恥ずかしい・・・
ご指摘通り、掲示板関連のソースを修正させていただきました。
その3にも書かせていただきましたが、
fgetsは1行ずつ読み込むため、改行をいれないと1行と認識しません。
そのために改行をいれます。
>しかし、今度は何も入力のない状態でそのページを開いたところエラーが発生してしまったため、現在も格闘中です。
とのことですが、ソースとエラー画面のキャプチャを送っていただければ見させていただきます。
matsumoto@donow.jpに送っていただければと思います。
エラー画面をみていないのでなんとも言えませんが、data.txtに空白で改行だけがはいっていると
Undefined offset: 1 in ~
というエラーメッセージが出ます。data.txtは何も入力のない状態の場合、改行も消さないといけません。
本当はそういったこと(空白行)まで想定して書かなくてはいけないのですが、上記のソースでは
学習上少しでも処理を減らしたいため、その処理を書いておりません。
こちら説明が不明でしたらまた書き込んでいただければと思います。
ひげ です。
返信ありがとうございます。
data.txtの文字を全て削除して起動をしてみたところmatsumotoさんのおっしゃっていたエラーコードが出てきました。
ですが、試しにdata.txtファイルを削除し、新たにdata.txtファイルを生成して実行したところ、エラーを出さずに起動できました。
文字だけ全て消しても改行情報は残ってるのですね・・・
おかげで解決できました。 ありがとうございます。
ひげさん
>返信ありがとうございます。
こちらこそコメントありがとうございます。
ひげさんのおかげで記事を修正することが出来ましたので・・・
他の記事でも正常に動かないもの、質問したいものなどあればどんどん
書いていただければと思います。
また技術的なこと以外でも疑問点などあればお気軽に質問していただければと思います。
こんにちは。
私はphp初心者で、こちらの記事を参考にソースコードを作成しましたが、テキストファイルを同じ階層に作ったにも関わらず「No such file or directory in Unknown on line 0」とエラーが出てしまいました。
調べてみても原因と解決策が分からず困ってしまったため、質問させていただきます。
ご回答の程、よろしくお願い致します。
あずさん
初めまして、管理人の松本です。
連絡が遅れまして、大変申し訳ありません。
個別にもメールさせていただきましたが、
もしよろしければソースを送っていただくことはできますでしょうか。
よろしくお願いします。
[…] 掲示板の作成方法 その4(ファイル読み込みとHTML表示) www.dt30.netPHPで掲示板を作ろう! 掲示板の作成方法 その4(ファイル読み… PHPで掲示板を作ろう! 掲示板の作成方法 まとめ www.dt30.net […]