回答受付が終了しました

[PHP初心者]PHPと.txtのみを使用しブログを作りたいです。コイン500 やり方などアドバイスお願いします。

[PHP初心者]PHPと.txtのみを使用しブログを作りたいです。コイン500 やり方などアドバイスお願いします。 できればプログラムも... ---理想--- 記事毎に.txtを作成(ファイルを作成するプログラムは完成しています) .txtにある記事の内容をPHP(html)で20件ずつ表示 次の20件をindex.php?p=2 などで表示したい .txtにはtitle:やuser:など固定の文字の横に、ファイルごとに違う内容が記されている。 ---【20200724-232000-01.txt】--- title:ここにタイトル date:2020/07/24 23時20分 user:山田 ip:192.168.1.1 text: ここに本文を入力します。 いままでは titile: date:などの横にその内容を入力していましたが、このtext:本文は次の行からファイルの一番最後まで読み込みたいです。 本文は改行やスペースがあります。 <p>テスト</p>このようにhtmlコードが書かれている場合がありますが、その内容はプログラムに反映させず、テキストとして表示させたいです。 .txtには一般に表示させないIPアドレスなども記載しています。 ---【20200724-232000-01.txt】おわり--- ---【index.php】イメージのみ(理想)をここに記載します--- <?php /*20件ずつ表示したい。 .txtのファイル名が"年月日-時刻-同時刻に書き込みがあった際に備えて01,02,03.txt"になっています。最新の書き込み順に20件表示 */ /*次の20件をindex.php?p=2 などで表示。 ・(例)記事が42件ある場合 [ページ1][ページ2][ページ3]とボタンを表示 ・(例)記事が25件存在するとして、index.php?p=3 というのはありません。その際には [ページ1][ページ2]まで表示 ・index.php?p=100など存在しないページの場合はエラーメッセージを表示 */ /*できるか分かりませんがイメージです...変数にしてhtmlに記載するとか? $title = .txtからタイトルを取得 $date = 日時取得 $text = 本文 */ ?> 完成イメージをwordで作成しました。 要求する内容が高度なことですがよろしくお願いします。

画像

PHP | ホームページ作成24閲覧xmlns="http://www.w3.org/2000/svg">500

回答(5件)

0

> [PHP初心者]PHPと.txtのみを使用しブログ 練習問題としてはアリですけど、実用性はほぼありません。 データベースを使う事を覚えると、「初心者」から一歩前進しますよ? 「データファイルを作成するプログラム」がどうなっているか不明ですが、この読み取って表示するプログラムと合わせて、ファイルのロック等をキッチリやらないとデータの消失を招きます。 __秒までの同一時刻に書き込まれる事を念頭に置いた __という事は、その辺りも配慮されているとは思いますが... __データベースを使わないと結構面倒です > 次の20件をindex.php?p=2 などで表示 最初のページを 0ページ 次のページは 1ページ の様に、0始まりにしておくと処理がいろいろと楽じゃないかなと思います。 表示上は1、2...だけどクエリは、p=0、p=1... と言う感じ。 __「好み」の範疇の問題かもしれませんが Googleは「何件目から表示するか」をクエリに付加しているみたいですね。 __1ページ当たり20件として、 __0件目から、20件目から、40件目から... __の様になっていました __こちらも0始まりですね > ファイル名が"年月日-時刻-(略)03.txt"になっています。 特定のディレクトリに、ブログデータファイルだけがあるのなら glob()で楽々取得できます。 > 最新の書き込み順に glob()での取得は古い順に並べ直してくれますので、逆順にするのは array_reverse() で一発です。 > 20件表示 最新のモノから納められた配列(上記で処理済み)を先頭から20回ループ処理すればOKです。 __逆順にせずループ処理時に末尾からってのもアリです __僕は混乱するのでやりません > ・(例)記事が42件ある場合 > [ページ1][ページ2][ページ3]とボタンを表示 記事が2000件あるとボタンを100個表示します? > 存在しないページの場合はエラーメッセージを表示 これも「好み」の問題だけど、指定したページに該当するのは0個だと考えれば、エラーページじゃなく、タイトルや本文を一つも表示しないだけってのもアリかと。 > .txtにはtitle:やuser:など固定の文字の横に、ファイルごとに違う内容が記されている。 ファイルの書式が決まっているのなら、個別に取り出していくのはさほど難しくは無いです。 書式がご提示の通りなら、 text:(改行文字) の所で、ブログの内容部分と、それ以外のパラメータとに分けてしまうのが便利だと思います。 分ける事はとても簡単でこんな感じです。($src にファイルの内容があるとする) list($header, $body) = explode("text:\n", $src, 2); こうする事で、ブログ内容部分にパラメータ名が出てきても全く問題無い(その関連処理をしないのだから当たり前)ので、処理が楽になります。 ただし、ファイルの作成時に書式をキッチリ守る必要があります。 __タイトルの中に改行文字やコロン : が含まれない事とか 後は $headerを改行文字で分割しておいて、それぞれを更に : で分割すれば、パラメータ名とその値が取得できますので、それらを使って $params[パラメータ名] = パラメータ値 の様にしてパラメータの配列を作っておきます。 > 変数にしてhtmlに記載するとか? 少し意味が解りませんが、 $tmpl = <<<TMPL <div class="article"> <p class="title">__title__</p> <div class="body">__body__</div> <p class="date">__date__</p> </div> TMPL; $html = ''; とでもしておいて、 ループ内で $article = $tmpl; してから、パラメータをこんな感じで置き換えるかな。 foreach($params as $name=>$value) { $esc = htmlspecialchars($value, ENT_QUOTES); $article = str_replace('__' . $name . '__', $esc, $article); } $html .= $article; (注)$params は $header から取り出した各パラメータがパラメータ名をキーに、パラメータ値を値とした配列にしておきます HTMLとして表示するのですから、htmlspecialchars()を必ず使ってください。 __全てのエンコードは UTF-8である事が前提です __今時それ以外の選択肢はありません __すでに出来上がっている「データファイルを作成するプログラム」 __も確認を テンプレート($tmpl)を別に用意しておくのは、プログラムの流れそのものとは本来無縁であるし、変更を容易にする(=プログラム本体の変更を減らす)のが目的です。 その為に、各パラメータをそれぞれ取得するのではなく、パターンに従って名前と値を取得する事を念頭に置いて示してきました。 > 要求する内容が高度 初心者さんが思うほど高度では無いと思います。 __それに「ベストアンサー」は名誉であるので欲しいと __思うだろうけど、使い道のないコインはそれほど魅力は... > できればプログラムも... 何をどう考えてそうするのかがプログラムでは重要です。 動作するプログラムを提示されるだけでは、初心者さんがそれを理解するのはとても難しいと思います。 __配慮すべき点が抜けているかなんて判らないです プログラムの提示を求めるよりも、それらを明確にして不完全でも良いので「自力で」書いてみて、どこがどう間違っているのかの指摘を受ける方が学習の進みが速いと確信します。

あぁ、最初にブログの本体部分を分けておいたのに、それを放置した様に書いてしまいましたね。ごめんなさい。 $bodyも $headerの各パラメータと同じ様に $params['body']に入れておいてください。 そうしておけば、$tmplの __body__の所に入れてくれます。

0

DBを使わずtxtファイルで保存して記事を書く例を載せておきます。 日付(YYYYmmdd)、タイトル、ログ [YYYYmmdd].txtに【,】区切りでタイトルとログをfile_put_contentsで入れる。 ファイルをglobで拾い上げ、file_get_contentsで読み込み、【,】でセパレートする ページ指定をするなら、「全部を一旦読み込んでn番目からn番目まで表示」みたいな形になるかと思いますので、規模によっては大変なことになります。 読み込みはファイル名順に読み込むので新着20件を読み込みとかはできません。新着順にするなら全部読み込んだものをソートし直す必要があります。 [投稿] <? $date=$_POST["date"]; $ttl=$_POST["ttl"]; $log_a=str_replace(",",",",$_POST["log_a"]); $log=str_replace("\n","<br>",$log_a); if($date && $ttl && $log){ $dat=$ttl.",".$log.","; file_put_contents($date.".txt",$dat); } ?> <body> date(Ymd):<input type="text" value="<?=$date?>" name="date"><br> Title:<input type="text" value="<?=$ttl?>" name="ttl"><br> Log:<textarea name="log_a"><?=$log_a?></textarea><br> <button type="submit">Submit</button> </body> -------------------------- [View] <? foreach (glob("*.txt")as $txtlog){ $r_date=str_replace(".txt","",$txtlog); $r_dat=$explode(",",file_get_contentss($txtlog)); $r_title[$r_date]=$r_dat[0]); $r_log[$r_date]=$r_dat[1]); } ?> <body> <?foreach($txtlog as $a1 => $a2){?> 日付:<?=$a1?><br> 表題:<?=$r_title[$a1]?><br> 表題:<?=$r_log[$a1]?><br> <hr> <?}?> </body>

0

#個人的にはDBを使う方が楽だとは思い #ます(それこそSQLiteでもいい)。 あえてテキストファイルで実装するなら、ファイルの一覧を取得するのは glob を使うのが手っ取り早いです。提示されたようなファイル名であれば年月を指定しての取得も簡単ですしね。 https://www.php.net/manual/ja/function.glob.php ページングだのテキストファイルの内容を表示するだのは、特に難しい部分はないと思います。ファイル一覧を配列に入れた時点で件数が既知なので、ページングは楽でしょう。 「htmlコードをプログラムに反映させない」というのがちょっと意味不明です。phpスクリプトはそのまま出力するだけなので・・・。htmlとして機能させたくない(なかったことにする)ならstrip_tagsを通しますし、htmlコードのまま表示させたければhtmlspecialcharsを通すことになります(いずれにしても「出力時」に通す)。

0

※ファイルを使った記事管理は、ファイル数が多くなると重くなるのでオススメできません。MySQLなどDBをオススメします。 ご希望の動きをさせるためには、 - scandir() を使ってファイルの一覧を取得して配列に入れる - 配列を必要に応じて arsort() などで順番を入れ替える(新しい順など) - この配列を使ってページャーを作る - $_GET['p'] でページ番号を取得する - array_slice() などでそのページ分の配列のみを残す - file_get_content() などで、ファイルを読み込む - 読み込んだファイルのテキストを preg_match() で正規表現を使ってデータを整頓する - 画面に出力する 大雑把に書くとこんな処理を書きます。 まずは、コードを書いてみてください。

0

文字列処理とGETメソッドの処理を書くだけだと思うんだけど、CGIについて勉強されたことはありますか? CGI勉強したらすぐ書けるようになりますよ。